【问题标题】:How to run SSH commands using Net::SSH::Perl?如何使用 Net::SSH::Perl 运行 SSH 命令?
【发布时间】:2018-10-12 04:40:42
【问题描述】:

我不知道我是否成功安装了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.

编辑2: 这是我的完整代码

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 更容易使用。

【问题讨论】:

  • 用我的 $ssh = Net::SSH::Perl->new($remote_host, options => ["Debug yes"]);打印前检查 err 的值。如果您不确定,请向我们展示 off err 的值和调试输出。
  • 它是"打印"$out", "\n";"。添加您给我的代码后,我收到了相同的错误消息(除了行号不同但指的是同一行代码)。
  • @weismat:这不是您为此模块启用调试的方式。
  • 你运行的 cmd 是什么?
  • @user967552,我正在使用 Cygwin,如果这就是你的意思。

标签: perl ssh


【解决方案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。您的用户名和密码不正确。

【讨论】:

  • 谢谢。我已添加到我的答案中以解释您的错误。调用后$err$exit的内容是什么?
  • 嗨。我很确定用户名和密码是正确的,因为我使用了相同的凭据并使用 Net::SSH 和 Expect 对登录进行编码,它不会给我任何错误。事实上,当我成功登录系统时,它设法打印出欢迎消息。
  • 我只能告诉你,软件说身份验证失败:-/
【解决方案2】:

Net::SSH::Perl 确实支持通过用户名/密码登录,我有一个工作示例,我刚刚让它工作。我使用上面的代码并取出双引号(“”)并改用单引号('')。并且“debug => 1”适用于在出现问题时调试代码。如果设置了调试选项,它将在您尝试登录时向您显示信息。

我正在连接到基于 Windows Powershell 的 Win32-OpenSSH SSHD 服务器,非常类似于支持 SFTP 的 BSDLinux SSHD 服务器。支持相同的基于 Linux 风格的连接。

我整天都在尝试所有其他 SSH 模块。希望有人可以使用此代码来运行命令并在需要时获取输出。

您可以使用“cpan -i module-name”安装 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";

【讨论】:

    【解决方案3】:

    Net::SSH::Perl 不支持仅通过交互式密码输入或公钥通过用户名/密码登录。有关详细信息,请参阅此帖子。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多