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