递归ssh命令中bash和perl中的引号

递归ssh命令中bash和perl中的引号,perl,bash,ssh,Perl,Bash,Ssh,我正在编写一个perl脚本,用ssh登录到服务器,并在服务器上执行一些shell命令。问题是,只有先登录到另一台服务器才能访问该服务器。 (我使用ssh密钥的无密码登录) 以下bash脚本工作正常,并说明了问题: #! /bin/bash server1="login.uib.no" server2="cipr-cluster01" ssh "$server1" "ssh $server2 \"echo \\\"\\\$HOSTNAME\\\"\"" 它将正确的主机名打印到我的屏幕:cipr-

我正在编写一个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脚本的引号有一些问题。

qx
的工作方式类似于双引号。您必须再反斜杠一些:

print qx/ssh "$server1" "ssh $server2 \"echo \\\\"\\\$HOSTNAME\\\\"\""/;
使用单引号可以大大简化命令:

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

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

print qx/ssh -o ProxyCommand="ssh -W %h:%p $server1" "$server2" 'echo \$HOSTNAME'/;
(代理命令(被信号1终止)有一些剩余输出,我不确定如何消除。)

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

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');
谢谢,这个有用!(我还发现,
printqx/ssh$server1\“ssh$server2\\\”echo\\\\$HOSTNAME\\\“/;
正在工作……但您的命令更简单)。