2014-05-11 10 views
5

Sto scrivendo uno script perl per accedere a un server con ssh e fare alcuni comandi della shell sul server. Il problema è che il server è accessibile solo registrandosi prima su un altro server. (sto usando il login senza password con le chiavi ssh).Citazione in bash e perl nel comando ssh ricorsivo

Il seguente script bash funziona correttamente, e illustra il problema:

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

Esso stampa il nome host corretto per il mio schermo: cipr-cluster01. Tuttavia, quando si cerca di fare stessa cosa in Perl:

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

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

ottengo il seguente output: login.uib.no. Quindi immagino, ci sono alcuni problemi con la citazione dello script perl ..

risposta

4

qx funziona come le doppie virgolette. Bisogna backslash ancora un po ':

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

Utilizzando apici potrebbe semplificare il comando di un sacco:

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

Grazie, questo funziona! (Ho anche trovato che 'print qx/ssh $ server1 \" ssh $ server2 \\\ "echo \\\\\ $ HOSTNAME \\\" \ "/;' funziona ... ma i tuoi comandi sono più semplici) . –

3

è possibile semplificare il citando un po' utilizzando l'opzione ProxyCommand che racconta ssh per la connessione a $server2 tramite $server1, anziché eseguire esplicitamente ssh su $server1.

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

(V'è una certa uscita residua dal comando proxy (stato terminato dal segnale 1) che io non sono sicuro di come sbarazzarsi di.)

1

È possibile utilizzare Net::OpenSSH che è in grado di fare il citando automaticamente:

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