![Contexto](https://rvso.com/image/50564/Contexto.png)
Contexto
Quiero configurar rsync
copias de seguridad de mi servidor, así que ejecuto el siguiente comando
rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/
Idealmente, ese comando solicitaría mi contraseña de clave ssh privada, luego se conectaría, luego solicitaría la contraseña de sudo para rsyncuser y luego ejecutaría rsync en el servidor. Pero recibí el infame error:
sudo: no tty present and no askpass program specified
Así que tuve que agregar esto a /etc/sudoers
(usando sudo visudo
), que básicamente le da al usuario acceso completo de lectura y escritura al sistema sin contraseña rsyncuser
, lo cual no es de mi agrado:
rsyncuser ALL= NOPASSWD:/usr/bin/rsync
Pregunta
¿Cómo puedo decirle a Sudo que lea su contraseña de, digamos, otro TTY?
De esa manera, podría ejecutar rsync
una ventana de terminal en mi máquina local y usar otra ventana de terminal para abrir una conexión ssh (posiblemente separada) al servidor y proporcionar la contraseña de sudo allí.
La única manera que pienso de hacer algo así sería usar un expect
script alrededor de sudo, que lee la contraseña de una canalización con nombre, y yo escribiría en esa canalización desde la otra terminal.
Nota: esto es más por el bien de la experimentación y el aprendizaje que por cualquier propósito práctico,No estoy tratando de descubrir cómo usar sudo con rsync, ya leí todo lo que pude encontrar sobre eso.
Respuesta1
sudo
leerá una variable de entorno, SUDO_ASKPASS
si no se está ejecutando desde una terminal (como en su caso) o si -A está configurado. Utiliza esto como un comando para ejecutar y obtener la contraseña. Por ejemplo:
echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"
Le solicitará la contraseña en la entrada estándar y no requerirá una terminal.
Sin embargo, en el caso específico de lo que está intentando hacer, podría ser mejor permitir el inicio de sesión SSH de root, pero solo con una clave SSH y el comando restringido a rsync. Hay un buen recurso sobre esto.aquí.
Respuesta2
Intentar:
ssh userfoo@host "sudo -S p'enter pw: ' [command] "
Esto emitirá una solicitud de contraseña (" enter pw:
") que se mostrará en su host/terminal local. La desventaja de esto es el riesgo de seguridad que supone que su contraseña se muestre sin cifrar en la ventana de su terminal. No se guardará en su archivo local .bash_history
, pero es el historial de desplazamiento hacia atrás de la ventana del terminal. Entonces, si estás usando Konsole, por ejemplo, usa Ctrl+ Shift+ Kpara borrarlo.