====== PerlからSSH ====== ===== yum(DAGリポジトリ)でインストール ===== DAGのrepoを追加 rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm Net:SSHをインストール yum --enablerepo=rpmforge install perl-Net-SSH-Perl yumでインストールされないモジュールをインストール perl -MCPAN -e shell install Math::BigInt install Math::BigInt::GMP サンプルコード #!/usr/bin/perl use strict; use Net::SSH::Perl; use Net::SSH::Perl::Constants qw(:msg); my $ssh = Net::SSH::Perl->new("HOSTNAME"); $ssh->login("USERNAME", "PASSWORD"); my ($stdout, $stderr, $exit) = $ssh->cmd('cat /etc/redhat-release'); print $stdout; $ssh->cmd("exit"); しかし、この状態では2度目にコードを実行したらエラーとなるのです ライブラリを修正して対応するとです cd /usr/lib/perl5/site_perl/5.8.8/Net/SSH/ cp -p Perl.pm Perl.pm.ORG 237行目付近に if ($! =~ /Address already in use/i) { というコードがありますので以下の通り書換えます。 #if ($! =~ /Address already in use/i) { if ($! =~ /(Address|The socket name is) already in use/i || $! =~ /アドレスは既に/) { 秘密鍵と公開鍵を使ってリモートのサーバーを操作する場合 サンプルコード #!/usr/bin/perl use strict; use Net::SSH::Perl; use Net::SSH::Perl::Constants qw(:msg); my $ssh = Net::SSH::Perl->new("172.16.1.205",protocol=>'2,1' , identity_files => ['公開鍵']); $ssh->login("USERNAME",""); my ($stdout, $stderr, $exit) = $ssh->cmd('ls /'); print $stdout; print "ERROR:". $stderr ."\n"; print "EXIT CODE:". $exit."\n"; $ssh->cmd("exit"); さっくり実行してみると Invalid key file type 'PEM': Base class package "Class::ErrorHandler" is empty. (Perhaps you need to 'use' the module which defines that package first.) at /usr/lib/perl5/vendor_perl/5.8.8/Convert/PEM.pm line 5 BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/5.8.8/Convert/PEM.pm line 5. Compilation failed in require at /usr/lib/perl5/vendor_perl/5.8.8/Crypt/DSA/Key/PEM.pm line 5. BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/5.8.8/Crypt/DSA/Key/PEM.pm line 5. Compilation failed in require at (eval 55) line 1. BEGIN failed--compilation aborted at (eval 55) line 1. at /usr/lib/perl5/vendor_perl/5.8.8/Net/SSH/Perl/Key/DSA.pm line 65 なんてエラーが出力した。 う~ん、鍵のタイプがPEMだぜ!そのタイプを使いたいなら"Class::ErrorHandler" をインストールしろやおりゃ!! ってな事をおっしゃってるのだろうね CPAN使ってインストールしてみる perl -MCPAN -e shell install Class::ErrorHandler おっ、無事にインストール出来たみたい。 再度サンプルコードを実行したら、エラー無く実行できた(^^) ===== CPANからインストールする場合 ===== yum -y install gcc gmp-devel gmp expat-devel yes '' | cpan -i Math::BigInt::GMP yes '' | cpan -i Net::SSH::Perl yes '' | cpan -i Math::BigInt::Pari なんとなく、これもインストールしてみたさ yes '' | cpan -i Test::Pod yes '' | cpan -i Test::Pod::Coverage こっちの場合は余分なリポジトリをインストールする必要はないのだ ライブラリを修正して対応するとです cd /usr/lib/perl5/site_perl/5.8.8/Net/SSH/ cp -p Perl.pm Perl.pm.ORG ===== 証明書の作成 ===== これがなけりゃ意味ないよねwww # ssh-keygen -t dsa -b 1024 -N '' パスフレーズ無しで作成してくれます # cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys # chmod 600 /root/.ssh/authorized_keys 公開鍵は/root/.ssh/id_dsa