- - PR -
NET::SSH::Perlを利用した鍵認証アクセス
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-12-10 16:44
はじめて投稿させて頂きます。
現在、CentOS5環境にてNET::SSH:erlを利用して、別ホストへSSHでログインして シェルを実行するスクリプトを作成してますが、 別ホストへのパスワード認証は問題なくアクセスできたのですが、 鍵認証にしたらうまくいきませんでした・・・ よろしければお力添いください --------------------------------------------------------- #!/usr/bin/perl -w use Net::SSH:erl; # ***は実際に秘密キーの場所をいれてます my @ids = "/home/***/.ssh/id_dsa"; my %sshparams = ( protocol => 2, interactive => 0, identity_files => \\@ids, debug => 1, UserKnownHostsFile => ["$ENV{HOME}/.ssh/known_hosts2", "$ENV{HOME}/.ssh/known_hosts" ], User => "***" ); my $ssh = Net::SSH:erl->new('servername', %sshparams); $ssh->login('相手先のユーザ','公開鍵のパスワード'); my ($stdout, $stderr, $exit) = $ssh->cmd("hostname ; date"); print $stdout; |
|
投稿日時: 2007-12-10 17:56
追記です。
秘密鍵をノンパスワードキーで作成した場合は、SSHの認証が通りました。 パスフレーズ有りの場合は、どこにパスフレーズを指定すればよいのか わかりません。。。 |
|
投稿日時: 2008-04-02 16:44
はじめまして、現在まったく同じ問題で悩んでいます。
NET::SSH:erlのソースを見て見たのですが、パブリックキー認証関連のソースを見ると 以下のようになっているようです。 ・・・・・/Net-SSH-Perl-1.30/lib/Net/SSH/Perl/Auth/PublicKey.pm 70 sub _auth_identity { 71 my $auth = shift; 72 my($auth_file) = @_; 73 my $ssh = $auth->{ssh}; 74 my($packet); 75 76 return unless -e $auth_file; 77 78 my($key); 79 $ssh->debug("Trying pubkey authentication with key file '$auth_file'"); 80 81 $key = Net::SSH:erl::Key->read_private_pem($auth_file, '', 82 \$ssh->{datafellows}); 83 if (!$key) { 84 my $passphrase = ""; 85 if ($ssh->config->get('interactive')) { 86 $passphrase = _read_passphrase("Enter passphrase for keyfile '$auth_file': "); 87 } 88 else { 89 $ssh->debug("Will not query passphrase for '$auth_file' in batch mode."); 90 } 91 92 $key = Net::SSH:erl::Key->read_private_pem($auth_file, 93 $passphrase, \$ssh->{datafellows}); 94 if (!$key) { 95 $ssh->debug("Loading private key failed."); 96 return 0; 97 } 98 } 99 100 $auth->_sign_send_pubkey($key, \&key_sign); 101 } このソースを見るだけと、以下の様に動作しているように見えます。 (すべて読んだわけではないので、たぶんとしかいえませんが・・) 1)認証ファイルを空のパスフレーズで解けたら、解けた結果をサーバ側に渡す。 2)空のパスフレーズで解けなかった場合。 −<インタラクティブモードの場合>− ターミナルにパスフレーズ入力を促すプロンプトを表示し、ターミナルからの入力結果を パスフレーズとして、認証ファイルを解いてみる。解くことができたらその結果を サーバに伝送する。 −<インタラクティブモードでない場合>− エラーとみなして返る アプリ側で保持したパスフレーズをMet::SSH:erlに食わせてパスフレーズ認証するのは このモジュールを修正しないと出来ないように見えます。 CPANに同様な記述を見つけました。やはりアプリでコントロールするのはちょっと 厳しいように見えます。 http://search.cpan.org/dist/Net-SSH-Perl/lib/Net/SSH/Perl/Auth/PublicKey.pm When loading each of the private key files, the client first tries to load the key using an empty passphrase. If this fails, the client either prompts the user for a passphrase (if the session is interactive) or skips the key altogether. 私のほうは、上記のソースをちょっと修正して通すようにしようと思っています。 |
1