我想使用Net :: SSH :: Perl模块在一行中执行两个命令..
实际上第一个命令设置了一些env变量,第二个命令运行一些需要为该shell设置env变量的命令。
如何使下面的代码工作
例如:
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
将无效,因为在同一会话中不会调用这两个调用。
答案 0 :(得分:3)
引用comprehensive Perl archive network:
($ out,$ err,$ exit)= $ ssh-&gt; cmd($ cmd,[$ stdin])
在远程服务器上运行命令$ cmd并返回标准输出, stderr,并退出该命令的状态。
如果提供了$ 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 && ..."
)答案 1 :(得分:1)
使用一些变量设置调用某个程序的最简单方法是将变量定义放在命令之前:
VAR1=VALUE1 VAR2=VALUE2 ... cmd arg1 arg2 arg3 ...
在您的情况下,您似乎已经在某个文件中有变量定义,请执行以下操作:
source /path/to/scripts/that/sets/vars.sh && cmd arg1 arg2 arg3 ...
在本地运行命令(即通过system
)或通过ssh
远程运行时都可以。
另请注意,您可能需要在变量名称和值以及命令名称和参数中引用shell元字符。
答案 2 :(得分:-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;