0

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

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

如何使下面的代码工作

例如:

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->cmd将不起作用,因为这两个调用不会在同一个会话中调用。

4

3 回答 3

3

引用全面的 Perl 存档网络

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

在远程服务器上运行命令 $cmd 并返回该命令的标准输出、标准错误和退出状态。

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

注意: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 完全支持在同一连接上运行多个命令。

所以你有两个选择:

  1. "cmd1 && cmd2 && cmd3 && ..."使用两个 & 符号 ( )链接您的命令
  2. 使用 SSHv2
于 2013-05-06T17:42:52.713 回答
1

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

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

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

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

这在本地运行命令(即通过system)或远程通过ssh.

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

于 2013-05-07T07:55:29.823 回答
-1
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;
于 2013-11-25T07:15:11.507 回答