递归ssh命令中bash和perl中的引号
我正在编写一个perl脚本,用ssh登录到服务器,并在服务器上执行一些shell命令。问题是,只有先登录到另一台服务器才能访问该服务器。 (我使用ssh密钥的无密码登录) 以下bash脚本工作正常,并说明了问题:递归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-
#! /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\\\“/;
正在工作……但您的命令更简单)。