サイドコンテンツ 【メイン】

推し:加藤安那

加藤安那 (ユメオイ少女)

Twitter: @_hana_celeb_

最新 15 件のエントリー

サイドコンテンツ 【サブ】

ブログ エントリー

  • Perl で SSH

    -

    Perl で 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 でも問題無かった。