ブログ エントリー
-
Perl で SSH
プログラム - 2018/09/23 01:58:39Perl で SSH
Net::OpenSSH は Windows 環境 (Cygwin を使ったとしても) 動作不可っぽいので Net::SSH::W32Perl を選択。
ネットに出回ってるサンプルや cpan などを見ながらコーディングしても繋がらない。 いや、繋がるけど認証されない。
半日ぐらい試行錯誤した結果行き着いたのが、ユーザー名とパスワードから UTF-8 フラグを落とすという事。 (
use utf8;していないなら encode は要らないと思う)盲点でした。
use strict; use warnings; use utf8; use Encode; use Net::SSH::W32Perl; # パスワード $ssh = Net::SSH::W32Perl->new($config->{ssh_host}, protocol => 2, interactive => 0, options => [ 'PasswordAuthentication yes', ], ); $ssh->login(encode('cp932', USERNAME), encode('cp932', PASSWORD)); # 鍵 $ssh = Net::SSH::W32Perl->new($config->{ssh_host}, protocol => 2, interactive => 0, # id_rsa は ssh-keygen で作成したファイル identity_files => [ 'id_rsa' ], options => [ 'PasswordAuthentication no', 'User ' . encode('cp932', USERNAME), ], ); $ssh->login(); # disconnect $ssh->sock()->close() if $ssh->sock(); undef($ssh);cmd メソッドは都度セッション張るため、cd とかでディレクトリを移動しても次の cmd ではホームディレクトリに戻ってしまいます。 cmd に渡すコマンドはセミコロンで区切るか、一連の処理をまとめた shell スクリプトや perl スクリプトを使った方がいいです。
options の外に User を書いてるサンプルがありましたが、現バージョンでは動作しません。 options の中に書いてください。
あまり関係無い話だけど、Net::FTP はフラグ付き UTF-8 でも問題無かった。
-
Perl で SSH
http://0pm.0am.jp/memo3/index.cgi?entry=20180923_015839

