2014-05-11 12 views
5

Piszę skrypt perla, aby zalogować się do serwera za pomocą ssh i wykonać pewne polecenia powłoki na serwerze. Problem polega na tym, że serwer jest dostępny tylko po zalogowaniu się na innym serwerze. (Używam logowania bez hasła z kluczami ssh).Cytowanie w bashu i perlu w rekursywnej komendzie ssh

Poniższy skrypt bash działa poprawnie, i ilustruje problem:

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

wypisuje prawidłową nazwę hosta do mojego ekranu: cipr-cluster01. Jednak, gdy próbuje zrobić to samo w Perl:

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

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

pojawia się następujący komunikat: login.uib.no. Tak myślę, że są pewne problemy z cytowaniem skryptu perla.

Odpowiedz

4

qx działa jak podwójne cytaty. Trzeba interpretacja odwrotnego ukośnika kilka:

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

Korzystanie apostrofów może uprościć Komenda dużo:

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

Dzięki, to działa! (Zauważyłem również, że 'print qx/ssh $ server1 \" ssh $ server2 \\\ "echo \\\\\\\ $ HOSTNAME \\\" \ "/;' działa ... ale twoje polecenia są prostsze) . –

3

można uprościć przytoczyć trochę za pomocą opcji ProxyCommand który mówi ssh połączyć się $server2 przez $server1, zamiast jawnie uruchamiać ssh na $server1.

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

(Istnieje pewna resztkowa wyjście z polecenia proxy (zabity przez sygnał 1), że nie jestem pewien, jak się pozbyć).

1

Można użyć Net::OpenSSH który jest w stanie wykonać automatycznie:

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