- PR -

NET::SSH::Perlを利用した鍵認証アクセス

1
投稿者投稿内容
スト
会議室デビュー日: 2007/11/29
投稿数: 4
投稿日時: 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/11/29
投稿数: 4
投稿日時: 2007-12-10 17:56
追記です。

秘密鍵をノンパスワードキーで作成した場合は、SSHの認証が通りました。
パスフレーズ有りの場合は、どこにパスフレーズを指定すればよいのか
わかりません。。。
ほーげー
会議室デビュー日: 2008/04/02
投稿数: 1
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)