在递归ssh命令中引用bash和perl

时间:2014-05-11 20:50:15

标签: perl bash ssh

我正在编写一个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脚本的引用存在一些问题..

3 个答案:

答案 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');