Solución 1:
A veces piensas demasiado en las cosas.
Rsync no estaba instalado en el sistema remoto.
/facepalm
Solución 2:
Pongo esto aquí para que pueda recordar y compartir este truco:
rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" [email protected]${HOSTNAME}:/ ${DEST_DIR}
Este método parece eludir el requisito de un tty tal como se aplica en el /etc/sudoers
predeterminado de algunos sistemas. archivo con Defaults requiretty
. Esta información se elaboró después de revisar esta pregunta y respuestas de SO.
En esa respuesta, recomiendan eliminar Defaults requiretty
de /etc/sudoers
. Este es el método más fácil. Sin embargo, si no puede modificar el host remoto /etc/sudoers
para eliminar esta opción de configuración, puede intentar forzar el rsync
local usar ssh -tt
. Esta opción para ssh
se describe en el ssh
página del manual del cliente como esta:
Forzar asignación de pseudo-terminal. Esto se puede usar para ejecutar programas arbitrarios basados en pantalla en una máquina remota, lo que puede ser muy útil, p. al implementar servicios de menú. Múltiples opciones -t fuerzan la asignación de tty, incluso si ssh no tiene tty local.
Por lo tanto, obligamos a ssh a asignar un pseudo-tty para evitar el error:
Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
sudo: sorry, you must have a tty to run sudo
Luego, el --rsync-path
se anula con un comando para hacer lo siguiente:
stty raw -echo; sudo /usr/bin/rsync
stty raw -echo
es establecer la disciplina de línea del terminal remoto como paso a través. Esto efectivamente hace que se comporte como una tubería que se usaría en lugar de una pseudo-terminal sin -tt
.
Entonces el comando rsync remoto será sudo /usr/bin/rsync
, que ahora tiene un pseudo-tty y pasará el requiretty
buscar sudo
.