Net::SSH2 パスワード入力もしつつ、インタラクティブにコマンドを実行する

そもそもプログラム内にユーザ名とパスワードを入れることがナンセンスなので、通常は カギ交換すませてパスワードなしにするのが定石です。

とは言っても、、、既に数十台のサーバがある中で、手動で設定していくのはカンベンしてください、ということで。

使うのは、Net::SSH2。で、Net::SSH2は libssh の perlラッパー?

まずは、libsshから


$ wget http://prdownloads.sourceforge.net/libssh2/libssh2-1.1.tar.gz?download
$ gzip -cd libssh2-1.1.tar.gz | tar xf -
$cd libssh2-1.1
$ mkdir $HOME/local
$ ./configure CC=gcc --prefix=$HOME/local
$ gmake
$ gmake install
$ ls ~/local/
include lib share
$ ls ~/local/lib/
libssh2.a libssh2.la libssh2.so libssh2.so.1 libssh2.so.1.0.1
$

次が、Net::SSH2


$ export LD_LIBRARY_PATH=$HOME/local/lib # libsshのパス
$ wget http://search.cpan.org/CPAN/authors/id/R/RK/RKITOVER/Net-SSH2-0.21.tar.gz
$ gzip -cd Net-SSH2-0.21.tar.gz | tar xf -
$ cd Net-SSH2-0.21
$ vi Makefile.PL
...
my $lib = '/export/home/[ユーザ名]/local/lib'; # libssh
my $inc = '/export/home/[ユーザ名]/local/include'; # libssh
...
$ perl Makefile.PL
$ make
$ make test
...
Result: PASS
$ make install

これで、$HOME/local/lib/perl5/site_perl/5.10.0 以下にインストールされます。

で、サンプル。(参考:http://www.perlmonks.org/?node_id=621761)


#!/usr/local/bin/perl

use strict;
use warnings;
use Net::SSH2;

my $ssh2 = Net::SSH2->new;

$ssh2->connect('localhost') or die "$!";

if( $ssh2->auth_keyboard('hoge','password')) { # ユーザ名&パスワード

my $chan = $ssh2->channel;
$chan->shell;
print "LINE : $_" while(<$chan>); # Greeting Message

print $chan "uname -a\n";
print "LINE : $_" while(<$chan>);

print $chan "pkginfo\n";
print "LINE : $_" while(<$chan>);

$chan->close;
}

で、実行。


$ export PERL5LIB=$HOME/local/lib/perl5/site_perl/5.10.0
$ ./test.pl
LINE : Sun Microsystems Inc. SunOS 5.11 snv_108 November 2008
LINE : SunOS Foxconn 5.11 snv_108 i86pc i386 i86pc
LINE : system BRCMbnx Broadcom NetXtreme II Gigabit Ethernet Adapter Driver
LINE : system FSWxorg-fonts-core X.Org Foundation X11 core font
...