Ecco una versione modificata della risposta di Willie Wheeler che trasferisce i file tramite tar ma supporta anche il passaggio di una password su sudo sull'host remoto.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Un po 'di magia in più qui è l'opzione -S per sudo. Dalla pagina man sudo:
-S, --stdin Scrive il prompt per l'errore standard e legge la password dall'input standard invece di usare il terminale. La password deve essere seguita da un carattere di nuova riga.
Ora vogliamo effettivamente che l'output di tar sia reindirizzato in ssh e che reindirizzi lo stdin di ssh allo stdout di tar, rimuovendo qualsiasi modo per passare la password in sudo dal terminale interattivo. (Potremmo usare la funzione ASKPASS di sudo sull'estremità remota ma questa è un'altra storia.) Possiamo ottenere la password in sudo anche se catturandola in anticipo e prepagandola sull'output tar eseguendo quelle operazioni in una subshell e eseguendo il piping dell'output di la subshell in ssh. Questo ha anche il vantaggio di non lasciare una variabile d'ambiente contenente la nostra password sospesa nella nostra shell interattiva.
Noterai che non ho eseguito 'read' con l'opzione -p per stampare un prompt. Questo perché la richiesta della password di sudo è convenientemente passata allo standard della nostra shell interattiva tramite ssh. Potresti chiederti "come viene eseguita sudo dato che è in esecuzione all'interno di ssh a destra della nostra pipe?" Quando eseguiamo più comandi e convogliamo l'output di uno nell'altro, la shell padre (la shell interattiva in questo caso) esegue ogni comando nella sequenza immediatamente dopo aver eseguito il precedente. Man mano che ogni comando dietro una pipe viene eseguito, la shell genitrice collega (reindirizza) lo stdout del lato sinistro allo stdin del lato destro. L'output diventa quindi input mentre passa attraverso i processi.
$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce:
[1]+ Stopped ( stty -echo; read passwd; stty echo; echo
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C
/var/www/ -xz; echo\""
$ pstree -lap $$
bash,7168
├─bash,7969
├─pstree,7972 -lap 7168
└─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`
La nostra shell interattiva è PID 7168, la nostra subshell è PID 7969 e il nostro processo ssh è PID 7970.
L'unico inconveniente è che read accetterà l'input prima che sudo abbia il tempo di rispedire il prompt. Su una connessione veloce e un host remoto veloce non te ne accorgerai, ma potresti essere lento. Eventuali ritardi non influiranno sulla possibilità di inserire il prompt; potrebbe apparire solo dopo aver iniziato a digitare.
Nota Ho semplicemente aggiunto una voce del file host per "remote_Host" al mio computer locale per la demo.