perlからSSH接続
Net::OpenSSH
Net::SSHとかもありますが、
自分的にはこっちのほうが直感的に使えた。
依存モジュールも少なくてインストールも簡単!
SYNOPSISのコピペ
use Net::OpenSSH; my $ssh = Net::OpenSSH->new($host); $ssh->error and die "Couldn't establish SSH connection: ". $ssh->error; $ssh->system("ls /tmp") or die "remote command failed: " . $ssh->error; my @ls = $ssh->capture("ls"); $ssh->error and die "remote ls command failed: " . $ssh->error; my ($out, $err) = $ssh->capture2("find /root"); $ssh->error and die "remote find command failed: " . $ssh->error; my ($rin, $pid) = $ssh->pipe_in("cat >/tmp/foo") or die "pipe_in method failed: " . $ssh->error; print $rin, "hello\n"; close $rin; my ($rout, $pid) = $ssh->pipe_out("cat /tmp/foo") or die "pipe_out method failed: " . $ssh->error; while (<$rout>) { print } close $rout; my ($in, $out ,$pid) = $ssh->open2("foo"); my ($pty, $pid) = $ssh->open2pty("foo"); my ($in, $out, $err, $pid) = $ssh->open3("foo"); my ($pty, $err, $pid) = $ssh->open3pty("login"); my $sftp = $ssh->sftp(); $sftp->error and die "SFTP failed: " . $sftp->error;
自分がよく使うパターン
SYNOPSISとかぶるところもありますが。
my $host = "hostname"; # ログイン認証 my $ssh = Net::OpenSSH->new( $host, ( user => 'username', password => 'pass', ), ); $ssh->error and die "Can't ssh to ". $host .": " . $ssh->error; # scp # オプション my %opts = ( copy_attrs => 1, # -pと同じ。オリジナルの情報を保持 recursive => 1, # -rと同じ。再帰的にコピー bwlimit => 40000, # -lと同じ。転送量のリミットをKbit単位で指定 glob => 1, # ファイル名に「*」を使えるようにする。 quiet => 0, # 進捗を表示する ); $ssh->scp_get(\%opts, $remote, $local) or die "scp failed: " . $ssh->error; # $ssh->scp_put(\%opts, $local, $remote) or die "scp failed: " . $ssh->error; # rsync # オプション my %opts = ( exclude => '*~', # 除外するパターン verbose => 1, # 詳細表示 ); $ssh->rsync_get(\%opts, $remote, $local) or die "rsync failed: " . $ssh->error; # $ssh->rsync_put(\%opts, $local, $remote) or die "rsync failed: " . $ssh->error; # システムコマンド $ssh->system("mkdir /hogeee") or die "remote command failed: " . $ssh->error; # コマンド結果をキャプチャ my @ls = $ssh->capture("ls"); $ssh->error and die "remote ls command failed: " . $ssh->error; # コマンド結果をキャプチャ2 my $ret = $ssh->capture({ timeout => 1 }, "find /"); $ssh->error and die "remote find command failed: " . $ssh->error;
鍵作るのめんどいときは、これでログイン認証してほげほげしてます。
いい感じ!
機能はたくさんあるので、詳細はドキュメントで。
http://search.cpan.org/~salva/Net-OpenSSH-0.47/lib/Net/OpenSSH.pm