Perlでパスワードの入力を自動化するにはどうすればよいですか?
コード:
my $makecmd .= system "ssh remotehost;";
system( "$makecmd" );
出力:
Enter passphrase for key '~/.ssh/id_rsa':
Perlでパスワードの入力を自動化するにはどうすればよいですか?
コード:
my $makecmd .= system "ssh remotehost;";
system( "$makecmd" );
出力:
Enter passphrase for key '~/.ssh/id_rsa':
SSH エージェントを使用して、パスフレーズをメモリに保存できます。このアプローチは、暗号化されていないキーを使用するよりも面倒ですが、安全性はわずかに高くなります。O'Reilly の本SSH、The Secure Shell: The Definitive Guideの 11.1 章Unattended SSH: Batch or cron Jobsには、2 つの方法の優れた比較があります。
暗号化されていない (パスフレーズのない) キーを使用する大きな利点は、構成が簡単なことです。空のパスフレーズでキーを生成するか、既存のキーでパスフレーズを何も設定しないようにするには、次を実行します。
ssh-keygen -f ~/.ssh/id_rsa -p
それだけです。これ以上の構成は必要ありません。これの大きな欠点は、秘密鍵がプレーン テキストでファイル システムに保存されていることです。
SSH エージェントの構成プロセスはより複雑で、使用するエージェントによって異なります。O'Reilly の本の第 6.3 章、SSH Agents、および IBM developerWorks の記事Getting started with SSH security and configurationssh-agent
では、OpenSSH に含まれるデフォルトのエージェントであるを構成する方法について説明しています。SSH キーに関する archlinux wiki ページでは、GNOME キーリングや pam_ssh などの他のエージェントについても説明しています。
の設定プロセスを見てみましょうssh-agent
。コマンドを実行すると
ssh-agent
エージェントを起動するだけでなく、いくつかの環境変数を設定するためのシェル コマンドも吐き出します。Bourne スタイルのシェルでは、出力は次のようになります。
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-barrett/ssh-3654-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3655; export SSH_AGENT_PID;
echo Agent pid 3655;
これらの環境変数は、シェルにエージェントへのアクセス方法を指示します。エージェントを使用するスクリプトでは、これらの環境変数を設定する必要があります。最初にエージェントを呼び出したときに後で使用するために、シェル コマンドをファイルに保存できます。
$ ssh-agent | head -2 > ~/agent-info
次に、秘密鍵をエージェントに追加する必要があります。
$ source ~/agent-info
$ ssh-add ~/.ssh/id_rsa
Need passphrase for ~/.ssh/id_rsa
Enter passphrase: **************
最後に、Perl スクリプトが呼び出されたときに適切な環境変数が設定されていることを確認する必要があります。これを行う 1 つの方法は、ラッパー スクリプトを記述することです。
#!/bin/sh
source ~/agent-info
/path/to/perl/script "$@"
エージェントが実行されている限り、スクリプトはパスフレーズを入力しなくても秘密鍵を使用できます。エージェントを使用する uid が 1 つだけの場合は、その uid でエージェントを起動するのが最も簡単です。
$ su <script_user> ssh-agent ...
エージェントを使用することの欠点の 1 つは、エージェントを手動で再起動し、サーバーの再起動時にパスフレーズを再入力する必要があることです。これは、暗号化されたキーを使用することで得られる (おそらくわずかな) 追加のセキュリティに対して支払う代償です。
これを行うには、Expect を使用できます。このページから: http://metacpan.org/pod/Net::SSH::Expect
パスフレーズの使用:
# Starting ssh without password
# 1) run the constructor
my $ssh = Net::SSH::Expect->new (
host => "myserver.com",
user => 'bnegrao',
raw_pty => 1
);
# 2) now start the ssh process
$ssh->run_ssh() or die "SSH process couldn't start: $!";
パスワードの使用:
use Net::SSH::Expect;
# Making an ssh connection with user-password authentication
# 1) construct the object
my $ssh = Net::SSH::Expect->new (
host => "myserver.com",
password=> 'pass87word',
user => 'bnegrao',
raw_pty => 1
);
# 2) logon to the SSH server using those credentials.
# test the login output to make sure we had success
my $login_output = $ssh->login();
if ($login_output !~ /Welcome/) {
die "Login has failed. Login output was $login_output";
}