Hier ist eine modifizierte Version von Willie Wheelers Antwort, die die Datei (en) über tar überträgt, aber auch die Übergabe eines Passworts an sudo auf dem Remote-Host unterstützt.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Das gewisse Extra an Magie ist hier die Option -S für sudo. Aus der sudo-Manpage:
-S, --stdin Schreiben Sie die Eingabeaufforderung zum Standardfehler und lesen Sie das Kennwort von der Standardeingabe, anstatt das Endgerät zu verwenden. Dem Passwort muss ein Zeilenumbruch folgen.
Jetzt wollen wir eigentlich, dass die Ausgabe von tar in ssh umgeleitet wird. Dadurch wird die Standardeingabe von ssh in die Standardeingabe von tar umgeleitet, sodass keine Möglichkeit mehr besteht, das Kennwort vom interaktiven Terminal an sudo zu übergeben. (Wir könnten die ASKPASS-Funktion von sudo auf der Remote-Seite verwenden, aber das ist eine andere Geschichte.) Wir können das Passwort in sudo einbinden, indem wir es im Voraus erfassen und der tar-Ausgabe voranstellen, indem wir diese Operationen in einer Subshell ausführen und die Ausgabe von weiterleiten die Unterschale in ssh. Dies hat auch den zusätzlichen Vorteil, dass eine Umgebungsvariable, die unser Passwort enthält, nicht in unserer interaktiven Shell baumelt.
Sie werden feststellen, dass ich "read" nicht mit der Option -p ausgeführt habe, um eine Eingabeaufforderung zu drucken. Dies liegt daran, dass die Passwortabfrage von sudo bequem über ssh an den stderr unserer interaktiven Shell zurückgegeben wird. Sie fragen sich vielleicht, wie sudo ausgeführt wird, wenn es in ssh rechts von unserer Pipe ausgeführt wird. Wenn wir mehrere Befehle ausführen und die Ausgabe von einem in einen anderen umleiten, führt die übergeordnete Shell (in diesem Fall die interaktive Shell) jeden Befehl in der Reihenfolge unmittelbar nach der Ausführung des vorherigen aus. Wenn jeder Befehl hinter einer Pipe ausgeführt wird, fügt die übergeordnete Shell die Standardausgabe der linken Seite der Standardausgabe der rechten Seite hinzu (leitet sie um). Die Ausgabe wird dann zur Eingabe, wenn sie Prozesse durchläuft.
$ (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"`
Unsere interaktive Shell ist PID 7168, unsere Subshell ist PID 7969 und unser SSH-Prozess ist PID 7970.
Der einzige Nachteil ist, dass beim Lesen Eingaben akzeptiert werden, bevor sudo Zeit hat, die Eingabeaufforderung zurückzusenden. Bei einer schnellen Verbindung und einem schnellen Remote-Host werden Sie dies nicht bemerken, aber möglicherweise, wenn eine der beiden langsam ist. Verzögerungen beeinträchtigen nicht die Möglichkeit, die Eingabeaufforderung einzugeben. Möglicherweise wird es erst angezeigt, nachdem Sie mit der Eingabe begonnen haben.
Hinweis Ich habe meinem lokalen Rechner für die Demo einfach einen Host-Dateieintrag für "remote_Host" hinzugefügt.