【问题标题】:Regarding running multiple ssh commands using perl关于使用 perl 运行多个 ssh 命令
【发布时间】:2014-02-25 01:41:56
【问题描述】:

我有点卡在这里我想 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 脚本然后调用它,或者我可以在 perl 本身中完成它而不需要任何 shell 脚本?

代码

#!/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 行的 Permission denied

谢谢

【问题讨论】:

    标签: perl ssh


    【解决方案1】:

    我认为您的问题是关于 SSH 到 single 远程主机并在那里运行 multiple 命令。如果这是真的,那么您需要将多个命令打包到远程 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。

    【讨论】:

    • 我可以发送命令,但我现在的问题是我得到的环境变量文件与 setup1 提供的一个文件 setup 2 提供的另一个 env 变量文件相同,但两者应该不同。
    • 我不太理解您的评论,但这听起来像是一个不同的问题。由于您无法向远程服务器发送多个命令,您介意接受这个答案并为您的下一个问题提出一个新问题吗?
    • 我的意思是我得到的环境变量文件是在 setup1 之后而不是在 setup2 之后我在 setup2 之后保留了 env > envtest.txt 但我仍然得到了具有 env 变量的文件第一个文件
    • 你必须解释 setup1setup2 在做什么。另外,请记住,进程不能影响其父进程的环境,只会影响其子进程的环境。
    【解决方案2】:

    你可以做什么:

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

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

    【讨论】:

    • 我尝试使用 NET::SSH::PERL,它说权限被拒绝,我给出了密钥的位置,但它仍然说被拒绝,但交互模式正在工作,但批处理模式不是。任何想法为什么
    • 我不能使用你说它不起作用的命令我试过 Net::OpenSSH 它说找不到包。您还有其他想法吗?
    • 您使用的是 ssh 密钥对 + ssh-agent 吗?如果没有,您应该这样做。
    • 不,我不是,您能指导我查看任何我可以了解更多信息的文档吗?
    • @sputnik 我做了所有这些事情,然后只有我在尝试连接。现在我正在编写一个可以执行 ssh 的 shell 脚本,但问题是我在执行 setup2 后需要环境变量,但我总是得到 setup 1 shell 脚本的环境变量,其中包括 setup1 然后 sleep 20 然后 setup 2 sleep 40 和env > test.txt 这就是为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2015-12-23
    • 2021-08-27
    • 2012-07-08
    • 2016-07-08
    相关资源
    最近更新 更多