目的 †リモートホストでSSHサーバが動作している場合に、自動ログインして一定の処理をさせて戻ってくるようにしたい。 たとえば、大量のVMがあり1台づつシャットダウンして回るのが非効率なので、スクリプトで処理させたい、など。 導入方法 †インストール †# Net::OpenSSHとIO::Ptyが必要 [ubuntu@lxc ~]$ sudo aptitude install libnet-openssh-perl libio-pty-perl スクリプト本体 †#!/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でシャットダウンする場合 †linuxサーバでの設定 †sudoコマンドでパスワードを聞かれないようにしておけばOK $ sudo visudo ----------8<---------- # これを最後の行に追加 UID ALL=NOPASSWD: /sbin/shutdown -h now ----------8<---------- シャットダウンスクリプト †#!/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; 注意事項 †sshで接続しようとする場合、~/.known_hostsにないホストには接続できないっぽいので、あらかじめエントリを作成しておく。または一度ログインすれば自動的に作成される。
Counter: 5443,
today: 1,
yesterday: 1
|