【问题标题】:Net::SSH::Perl module: Executing multiple commandsNet::SSH::Perl 模块:执行多个命令
【发布时间】:2013-05-06 17:36:02
【问题描述】:

我想使用 Net::SSH::Perl 模块在一行中执行两个命令..

实际上第一个命令设置了一些环境变量,第二个运行一些需要为该外壳设置环境变量的命令。

如何使下面的代码工作

例如:

use Net::SSH::Perl;
my $hostname = "<<hostname>>";
my $username = "<<username>>";
my $password = "<<password>>";

my $cmd = 'export PATH= *** ; java -version';

my $ssh = Net::SSH::Perl->new("$hostname", debug=>0);
$ssh->login("$username","$password");

my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd");
print $stdout;

这个问题已经在这个网站上被问过了,但是没有答案。

多次调用$ssh-&gt;cmd 将不起作用,因为这两个调用不会在同一个会话中调用。

【问题讨论】:

  • 您是否将链接添加到另一个问题...您可以进一步讨论而不是开始新的讨论吗?

标签: perl net-ssh


【解决方案1】:

引用comprehensive Perl archive network:

($out, $err, $exit) = $ssh->cmd($cmd, [ $stdin ])

在远程服务器上运行命令 $cmd 并返回标准输出, stderr,以及该命令的退出状态。

如果提供了 $stdin,它将提供给远程命令 $cmd on 标准输入。

注意:SSH-1 协议不支持运行多个命令 每个连接,除非这些命令链接在一起,以便 远程外壳可以评估它们。正因为如此,一个新的插座 每次调用 cmd 时都会创建连接,并处理掉 然后。换句话说,这段代码:

my $ssh = Net::SSH::Perl->new("host1");
$ssh->login("user1", "pass1");

$ssh->cmd("foo");
$ssh->cmd("bar");

实际上会在第一次调用 cmd 时连接到 sshd,然后 断开;然后在第二次调用 cmd 时再次连接,然后 再次断开连接。

请注意,这不适用于 SSH-2 协议。 SSH-2 完全 支持在同一连接上运行多个命令。

所以你有两个选择:

  1. 使用两个 & 符号 ("cmd1 &amp;&amp; cmd2 &amp;&amp; cmd3 &amp;&amp; ...") 链接您的命令
  2. 使用 SSHv2

【讨论】:

  • 如何使用 SSHv2?
【解决方案2】:

调用设置了一些变量的程序的最简单方法是将变量定义放在命令之前:

VAR1=VALUE1 VAR2=VALUE2 ... cmd arg1 arg2 arg3 ...

如果您似乎已经在某个文件中定义了变量,请执行以下操作:

source /path/to/scripts/that/sets/vars.sh && cmd arg1 arg2 arg3 ...

这在本地运行命令(即通过system)或通过ssh远程运行时都有效。

另请注意,您可能需要在变量名称和值以及命令名称和参数中引用 shell 元字符。

【讨论】:

    【解决方案3】:
    use Net::SSH::Perl;
    my $hostname = "<<hostname>>";
    my $username = "<<username>>";
    my $password = "<<password>>";
    
    my $cmd1 = "source ~ur_env_paths";
    my $cmd2 = "your next command";
    
    my $ssh = Net::SSH::Perl->new("$hostname", debug=>0);
    $ssh->login("$username","$password");
    
    my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd1 && $cmd2"); ## just enter ur commands and they will execute in that sequence.
    
    print $stdout;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2020-08-07
      • 2014-07-09
      相关资源
      最近更新 更多