#contents * 目的 [#l629e1e8] リモートホストでSSHサーバが動作している場合に、自動ログインして一定の処理をさせて戻ってくるようにしたい。 たとえば、大量のVMがあり1台づつシャットダウンして回るのが非効率なので、スクリプトで処理させたい、など。 * 導入方法 [#m09b3621] ** インストール [#e1fdddf7] # Net::OpenSSHとIO::Ptyが必要 [ubuntu@lxc ~]$ sudo aptitude install libnet-openssh-perl libio-pty-perl ** スクリプト本体 [#l3299498] #!/usr/bin/perl use strict; use Net::OpenSSH; my ($host,$ssh,$buf,$uid,$pwd,$cmd); my (@hosts,@bufs); $uid = "UID"; $pwd = "PWD"; $ssh = Net::OpenSSH->new( $host, (user=>$uid , password=>$pwd) ); $ssh->error and die "Can't ssh to : " . $ssh->error; # コマンドを発行 $ssh->system("touch /tmp/check") or die "remote command failed: " . $ssh->error; # コマンド結果をキャプチャ @bufs = $ssh->capture("cat /etc/debian_version"); $ssh->error and die "remote ls command failed: " . $ssh->error; foreach(@bufs){ print $_; } # コマンド結果をキャプチャ2 $buf = $ssh->capture({ timeout => 1 }, "cat /proc/cpuinfo"); $ssh->error and die "remote find command failed: " . $ssh->error; print $buf."\n"; exit; * linuxサーバをsshでシャットダウンする場合 [#gbaff7c1] ** linuxサーバでの設定 [#t38ecf33] sudoコマンドでパスワードを聞かれないようにしておけばOK $ sudo visudo ----------8<---------- # これを最後の行に追加 UID ALL=NOPASSWD: /sbin/shutdown -h now ----------8<---------- ** シャットダウンスクリプト [#y73fdcc1] #!/usr/bin/perl use strict; use Net::OpenSSH; my ($host,$ssh,$buf,$uid,$pwd,$cmd); my (@hosts,@bufs); $uid = "UID"; $pwd = "PWD"; $cmd = "sudo shutdown -h now"; @hosts = qw(192.168.10.1 192.168.10.2 192.168.10.3 192.168.10.4); foreach $host (@hosts) { print "$host : execute...\n"; if(`ping $host -c 1 -s 1 -w 1 | grep "bytes from"`){ $ssh = Net::OpenSSH->new( $host, (user=>$uid , password=>$pwd) ); $ssh->error and die "Can't ssh to : " . $ssh->error; $ssh->system($cmd) or die "remote command failed: " . $ssh->error; }else{ print " ping fail\n"; } } exit; * 注意事項 [#fd1f3a8d] sshで接続しようとする場合、~/.known_hostsにないホストには接続できないっぽいので、あらかじめエントリを作成しておく。または一度ログインすれば自動的に作成される。~ もしくは、/etc/ssh/ssh_config の StrictHostKeyChecking no を追加すると、自動的にキーが追加/更新されるので、これでもよい。 ~ ~ ~ #counter