Net::SSH::Perl模块:执行多个命令

Net::SSH::Perl模块:执行多个命令,perl,net-ssh,Perl,Net Ssh,我想使用Net::SSH::Perl模块在一行中执行两个命令 实际上,第一个命令设置一些env变量,第二个命令运行一些命令,需要为该shell设置env变量 如何使下面的代码工作 例如: 使用Net::SSH::Perl; 我的$hostname=“”; 我的$username=“”; 我的$password=“”; my$cmd='导出路径=***;java版本'; 我的$ssh=Net::ssh::Perl->new(“$hostname”,debug=>0); $ssh->login(“$

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

实际上,第一个命令设置一些env变量,第二个命令运行一些命令,需要为该shell设置env变量

如何使下面的代码工作

例如:

使用Net::SSH::Perl;
我的$hostname=“”;
我的$username=“”;
我的$password=“”;
my$cmd='导出路径=***;java版本';
我的$ssh=Net::ssh::Perl->new(“$hostname”,debug=>0);
$ssh->login(“$username”,“$password”);
my($stdout,$stderr,$exit)=$ssh->cmd($cmd”);
打印$stdout;
这个问题已经在这个网站上提出了,但是没有答案

多次调用
$ssh->cmd
无效,因为这两个调用不会在同一会话中调用。

引用以下内容:

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

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

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

注意:SSH-1协议不支持运行多个命令 每个连接,除非这些命令链接在一起,以便 远程shell可以对它们进行评估。因此,一个新的插座 每次调用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完全 支持在同一连接上运行多个命令

所以你有两个选择:

  • 使用两个符号(
    “cmd1&&cmd2&&cmd3&&…”链接命令
  • 使用SSHv2
  • 引用:

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

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

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

    注意:SSH-1协议不支持运行多个命令 每个连接,除非这些命令链接在一起,以便 远程shell可以对它们进行评估。因此,一个新的插座 每次调用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完全 支持在同一连接上运行多个命令

    所以你有两个选择:

  • 使用两个符号(
    “cmd1&&cmd2&&cmd3&&…”链接命令
  • 使用SSHv2

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

    VAR1=VALUE1 VAR2=VALUE2 ... cmd arg1 arg2 arg3 ...
    
    在您的情况下,在某些文件中似乎已经有了变量定义,请执行以下操作:

    source /path/to/scripts/that/sets/vars.sh && cmd arg1 arg2 arg3 ...
    
    这在本地运行命令(即通过
    system
    )或通过
    ssh
    远程运行命令时都有效


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

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

    VAR1=VALUE1 VAR2=VALUE2 ... cmd arg1 arg2 arg3 ...
    
    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;
    
    在您的情况下,在某些文件中似乎已经有了变量定义,请执行以下操作:

    source /path/to/scripts/that/sets/vars.sh && cmd arg1 arg2 arg3 ...
    
    这在本地运行命令(即通过
    system
    )或通过
    ssh
    远程运行命令时都有效

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

    使用Net::SSH::Perl;
    
    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;
    
    我的$hostname=“”; 我的$username=“”; 我的$password=“”; my$cmd1=“source~ur\u env\u路径”; my$cmd2=“您的下一个命令”; 我的$ssh=Net::ssh::Perl->new(“$hostname”,debug=>0); $ssh->login(“$username”,“$password”); my($stdout、$stderr、$exit)=$ssh->cmd($cmd1&&$cmd2);#只要输入ur命令,它们就会按顺序执行。 打印$stdout;
    使用Net::SSH::Perl;
    我的$hostname=“”;
    我的$username=“”;
    我的$password=“”;
    my$cmd1=“source~ur\u env\u路径”;
    my$cmd2=“您的下一个命令”;
    我的$ssh=Net::ssh::Perl->new(“$hostname”,debug=>0);
    $ssh->login(“$username”,“$password”);
    my($stdout、$stderr、$exit)=$ssh->cmd($cmd1&&$cmd2);#只要输入ur命令,它们就会按顺序执行。
    打印$stdout;
    
    是否将链接添加到其他问题。。。你能继续讨论而不是开始新的讨论吗?你能添加到另一个问题的链接吗。。。你能不能进一步讨论而不是开始一个新的讨论?你如何使用SSHv2?你如何使用SSHv2?