我正在编写一个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脚本的引用存在一些问题..
答案 0 :(得分:4)
qx
就像双引号一样。你还需要反斜杠:
print qx/ssh "$server1" "ssh $server2 \"echo \\\\"\\\$HOSTNAME\\\\"\""/;
使用单引号可能会大大简化命令:
print qx/ssh "$server1" 'ssh $server2 "echo \\\$HOSTNAME"'/;
答案 1 :(得分:3)
您可以使用ProxyCommand
选项简化引用,告诉ssh
通过$server2
连接到$server1
,而不是显式运行ssh
在$server1
。
print qx/ssh -o ProxyCommand="ssh -W %h:%p $server1" "$server2" 'echo \$HOSTNAME'/;
(代理命令有一些残余输出(被信号1杀死),我不知道如何摆脱它。)
答案 2 :(得分:1)
您可以使用能够自动执行引用的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');