目的

リモートホストで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にないホストには接続できないっぽいので、あらかじめエントリを作成しておく。または一度ログインすれば自動的に作成される。
もしくは、/etc/ssh/ssh_config の StrictHostKeyChecking? no を追加すると、自動的にキーが追加/更新されるので、これでもよい。


Counter: 5443, today: 1, yesterday: 1

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-11-30 (日) 23:23:15 (3433d)