关于使用perl运行多个ssh命令

时间:2014-02-21 17:03:47

标签: perl ssh

我有点卡在这里我想ssh到一台机器然后运行大约3个命令,这些命令基本上是设置命令,然后我想用该机器的env变量返回我的机器

setup1
setup2
setup3
env > envtext.txt.
return back 

所有这些我必须在perl中进行

我试过像这样的命令 system("ssh @machine command1 && command 2")无效

有类似的东西吗?

system("ssh @machine command1 -cmd command 2 -cmd command 3")

如果不是最好的方法 比如制作一个shell脚本然后调用它,或者我可以在没有任何shell脚本的情况下在perl中完成它?

代码

#!/usr/bin/perl -w

use Net::SSH::Perl;


my $host = "address";
my $user = "name";
my $password = "password";

- 设置新连接

 my $ssh = Net::SSH::Perl->new($host,
    debug=>0,

    identity_files => ['path to key'],
           options=> ["StrictHostKeyChecking  no"]
           #interactive => yes,
    );

- 验证

$ssh->login($user,$password);

- 执行命令

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

print $stdout;`
它给出的

错误是ssh.pl第25行的权限被拒绝

谢谢

2 个答案:

答案 0 :(得分:0)

你能做什么:

system("ssh $_ command1 -cmd command 2 -cmd command 3") for @machines;

另一个Pure Perl解决方案是使用Net::OpenSSH

答案 1 :(得分:0)

我认为您的问题是关于SSH到单个远程主机并在那里运行多个命令。如果这是真的,那么您需要将多个命令打包到远程shell可以执行的单个命令行中。最简单的方法是使用system的列表形式,并将命令行作为单个参数传递:

system "ssh", "machine", "setup1; setup2; setup3";

问题的第二部分:您希望从远程端获取数据。为此,您希望程序读取SSH的输出,而不是使用system。为此,您可以使用:

open my $FH, "-|", "ssh", "machine", "setup1; setup2; setup3; env";
my @lines_from_ssh = <$FH>;
close $FH;

如果您还需要向远程端发送输入,请查看IPC :: Open2。如果需要同时捕获stdout和stderr,请参阅IPC :: Open3。