【问题标题】:Quoting in bash and perl in recursive ssh command在递归 ssh 命令中引用 bash 和 perl
【发布时间】:2014-05-13 15:33:46
【问题描述】:

我正在编写一个 perl 脚本来使用 ssh 登录到服务器并在服务器上执行一些 shell 命令。问题是服务器只能通过首先登录到另一台服务器来访问。 (我正在使用带有 ssh 密钥的无密码登录)。

以下 bash 脚本工作正常,并说明了问题:

#! /bin/bash
server1="login.uib.no"
server2="cipr-cluster01"
ssh "$server1" "ssh $server2 \"echo \\\"\\\$HOSTNAME\\\"\""

它将正确的主机名打印到我的屏幕上:cipr-cluster01。但是,当尝试在 Perl 中做同样的事情时:

my $server1="login.uib.no";
my $server2="cipr-cluster01";

print qx/ssh "$server1" "ssh $server2 \"echo \\\"\\\$HOSTNAME\\\"\""/;

我得到以下输出:login.uib.no。所以我想,perl 脚本的引用存在一些问题..

【问题讨论】:

    标签: perl bash ssh


    【解决方案1】:

    qx 像双引号一样工作。你必须多加一些反斜杠:

    print qx/ssh "$server1" "ssh $server2 \"echo \\\\"\\\$HOSTNAME\\\\"\""/;
    

    使用单引号可能会大大简化命令:

    print qx/ssh "$server1" 'ssh $server2 "echo \\\$HOSTNAME"'/;
    

    【讨论】:

    • 谢谢,这行得通! (我还发现print qx/ssh $server1 \"ssh $server2 \\\"echo \\\\\\\$HOSTNAME\\\"\"/; 正在工作.. 但你的命令更简单)。
    【解决方案2】:

    您可以通过使用ProxyCommand 选项来简化引用,该选项告诉ssh 通过$server1 连接到$server2,而不是在$server1 上显式运行ssh

    print qx/ssh -o ProxyCommand="ssh -W %h:%p $server1" "$server2" 'echo \$HOSTNAME'/;
    

    (代理命令有一些残留输出(被信号 1 杀死)我不知道如何摆脱。)

    【讨论】:

      【解决方案3】:

      您可以使用Net::OpenSSH 自动进行报价:

      my $ssh_gw = Net::OpenSSH->new($gateway);
      my $proxy_command = $ssh_gw->make_remote_command({tunnel => 1}, $host, 22);
      my $ssh = Net::OpenSSH->new($host, proxy_command => $proxy_command);
      $ssh->system('echo $HOSTNAME');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-26
        • 2013-10-03
        • 1970-01-01
        • 2011-06-24
        • 2017-07-22
        • 1970-01-01
        • 2017-06-15
        • 2013-05-29
        相关资源
        最近更新 更多