2

モジュールを正常にインストールできたかどうかはわかりませんがNet::SSH::Perl、次のコードを実行できないようです:

my $ssh = Net::SSH::Perl->new($remote_host);
$ssh->login($username, $password);
print "login done", "\n";
my ($out, $err, $exit) = $ssh->cmd($cmd);
print "$out", "\n";

ログインはできますが、印刷できません$out。このエラーが発生し続けます:

Use of uninitialized value $out in string at test_ssh.pl line 28.

28行目は を参照していprint "$out", "\n";ます。

このコードを Cygwin で実行しています。私は今どうすればいい?

編集:実行時に次のエラーメッセージが表示されましたmy $ssh = Net::SSH::Perl->new($remote_host, options => ["Debug yes"]);

Use of uninitialized value $out in string at test_ssh.pl line 29 (#1)
    (W uninitialized) An undefined value was used as if it were already
    defined.  It was interpreted as a "" or a 0, but maybe it was a mistake.
    To suppress this warning assign a defined value to your variables.

    To help you figure out what was undefined, perl will try to tell you the
    name of the variable (if any) that was undefined. In some cases it cannot
    do this, so it also tells you what operation you used the undefined value
    in.  Note, however, that perl optimizes your program and the operation
    displayed in the warning may not necessarily appear literally in your
    program.  For example, "that $foo" is usually optimized into "that "
    . $foo, and the warning will refer to the concatenation (.) operator,
    even though there is no . in your program.

EDIT2:これが私の完全なコードです

use strict;
use warnings;
use Net::SSH::Perl;

my $remote_host = '<host ip address>';
my $password    = 'pass';
my $username    = 'user';
my $cmd         = 'copy run tftp:<my own ip address>';

warn "Starting SSH Services:...";
my $ssh = Net::SSH::Perl->new($remote_host, debug => 1);
print "done", "\n";

warn "Starting Login:...";
$ssh->login($username, $password);
print "login done", "\n";

warn "Starting command:...";
#$ssh->cmd($cmd);
#my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
my ($out, $err, $exit) = $ssh->cmd($cmd);
print "$out", "\n";

"print "$out","\n";" のエラー メッセージ ライン:

<Computername>: channel 1: new [client-session]
<Computername>: Requesting channel_open for channel 1.
<Computername>: Entering interactive session.
<Computername>: Channel open failure: 1: reason 4:
Use of uninitialized value $out in string at test_ssh.pl line 29.

最終編集: Net::Appliance::Session を使用して、SSH 経由でネットワーク デバイスにログインすることにしました。Net::SSH::Perl よりもはるかに使いやすいです。

4

3 に答える 3

1

あなたのコードをもっと見せてください。の値は$cmd?

このメソッドはログインを実行しないことに注意してください。呼び出しloginごとに接続を設定するときに使用するユーザー名とパスワードを保存するだけです。cmd

デバッグ メッセージを有効にする正しい方法は次のとおりです。

my $ssh = Net::SSH::Perl->new($remote_host, debug => 1);

cmdこれにより、特に言うべきメソッドからのトレース情報が得られます

Sending command: xxx
Entering interactive session.

何が問題なのかについての手がかりが得られるはずです。


デバッグ出力に問題が示されています。を見てSSH2.h、オープン失敗理由4はSSH2_DISCONNECT_HOST_AUTHENTICATION_FAILEDです。ユーザー名とパスワードが正しくありません。

于 2012-04-10T05:53:36.677 に答える
1

Net::SSH::Perlは username/password によるログインをサポートしています。上記のコードを使用して、二重引用符 (" ") を削除し、代わりに単一引用符 (' ') を使用しました。また、「debug => 1」は、問題が発生したときにコードをデバッグするために機能します。デバッグ オプションが設定されている場合、ログインしようとすると情報が表示されます。

SFTPをサポートするBSDLinux SSHDサーバーと非常によく似たWindows Powershellに基づくWin32-OpenSSH SSHDサーバーに接続しています。同じ Linux スタイル ベースの接続をサポートします。

私は一日中、他のすべての SSH モジュールを試してきました。誰かがこのコードを使用してコマンドを実行し、必要に応じて出力を取得できることを願っています。

「cpan -i モジュール名」で Net::SSH::Perl をインストールできます。

 use Net::SSH::Perl;

my $host = 'testmachine.acme.local';     #Or just IP Address
my $user = 'domain\username';            #Or just username
my $pass = 'Password@123';
my $cmd = 'dir C:\\Windows\\'; 

use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host, debug => 1);
$ssh->login($user, $pass);
my ($out, $err, $exit) = $ssh->cmd($cmd);
print "$out", "\n";
于 2018-10-11T20:40:42.197 に答える
0

Net::SSH::Perl は、ユーザー名/パスワードによるログインをサポートしていません。インタラクティブなパスワード入力または公開鍵によるものだけです。詳細については、この投稿を参照してください。

http://www.perlmonks.org/?node_id=590452

于 2013-01-10T09:39:18.057 に答える