Aquí hay una versión modificada de la respuesta de Willie Wheeler que transfiere los archivos a través de tar pero también admite pasar una contraseña a sudo en el 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\""
El poco de magia extra aquí es la opción -S para sudo. Desde la página de manual de sudo:
-S, --stdin Escriba la solicitud en el error estándar y lea la contraseña de la entrada estándar en lugar de usar el dispositivo terminal. La contraseña debe ir seguida de un carácter de nueva línea.
Ahora realmente queremos que la salida de tar se canalice a ssh y eso redirija el stdin de ssh al stdout de tar, eliminando cualquier forma de pasar la contraseña a sudo desde el terminal interactivo. (Podríamos usar la función ASKPASS de sudo en el extremo remoto, pero esa es otra historia). Sin embargo, podemos obtener la contraseña en sudo al capturarla de antemano y anteponerla a la salida tar realizando esas operaciones en un subshell y canalizando la salida de la subshell en ssh. Esto también tiene la ventaja adicional de no dejar una variable de entorno que contiene nuestra contraseña colgando en nuestro shell interactivo.
Notarás que no ejecuté 'leer' con la opción -p para imprimir un mensaje. Esto se debe a que la solicitud de contraseña de sudo se pasa convenientemente de vuelta al stderr de nuestro shell interactivo a través de ssh. Quizás se pregunte "¿cómo se está ejecutando sudo dado que se ejecuta dentro de ssh a la derecha de nuestra tubería?" Cuando ejecutamos múltiples comandos y canalizamos la salida de uno a otro, el shell principal (el shell interactivo en este caso) ejecuta cada comando en la secuencia inmediatamente después de ejecutar el anterior. A medida que se ejecuta cada comando detrás de una tubería, el shell principal adjunta (redirige) la salida estándar del lado izquierdo a la entrada estándar del lado derecho. La salida se convierte en entrada a medida que pasa por los procesos.
$ (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"`
Nuestro shell interactivo es PID 7168, nuestro subshell es PID 7969 y nuestro proceso ssh es PID 7970.
El único inconveniente es que la lectura aceptará la entrada antes de que sudo tenga tiempo de enviarla nuevamente. En una conexión rápida y un host remoto rápido, no lo notará, pero podría hacerlo si alguno de ellos es lento. Cualquier retraso no afectará la capacidad de ingresar a la solicitud; puede aparecer después de que hayas comenzado a escribir.
Tenga en cuenta que simplemente agregué una entrada de archivo de host para "remote_Host" a mi máquina local para la demostración.