我有点卡在这里我想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行的权限被拒绝
谢谢
答案 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。