SSH: ejecutar el comando sudo


44

Tengo un script de shell interactivo, que en un lugar necesita ssh a otra máquina (basado en Ubuntu) y ejecutar algo como root (el usuario debe ingresar su contraseña, pero el comando remoto debe ejecutarse como se indica en el script):

# ...
ssh remote-machine 'sudo ls'
# ...

Sin embargo, siempre recibo este mensaje de error:

sudo: no tty present and no askpass program specified

OK, eso está bastante claro. Pero, ¿cómo puedo evitar esto? Algo como esto debería suceder:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

Respuestas:


52

Lo maravilloso sshtiene una cura para todo. El punto es agregar la -tbandera para forzar a ssh a asignar un pseudo-tty:

ssh -t remote-server 'sudo ls'

1
Sin embargo, los PTY pueden estropear las cosas con los scripts. lsla salida contendrá \ r \ n terminaciones, por ejemplo.
Tobu

1
La forma fácil de evitarlo es forzar ls a modo no terminal. ls | cathará - verá que stdout es una tubería. En esta pregunta específica, eso no es relevante, ya que aparentemente está destinado a ejecutarse de forma interactiva desde un terminal, por lo que probablemente desee las columnas y los colores y otras cosas.
Gabe

0

Este método ejecutará un solo script usando sudo después de ssh:

Supongamos que tenemos un usuario "remoto" con capacidades de sudo y que tenemos un script que queremos que se ejecute como root.

1) Configure un script en / etc / passwd para usarlo al iniciar sesión:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Dentro de "login.sh", ejecutamos el script que queremos ejecutar como "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Normalmente pedirá la contraseña dos veces: ssh login + sudo. Si desea ingresarlo solo una vez, intente sudo sin contraseña (no recomendado). <- por favor lea el comentario de Boldewyn.

La principal ventaja es que "ssh" no requiere ningún otro parámetro (como -t), y sudo es forzado en el lado del servidor. Además, una vez que se cierra el script, el usuario también cierra sesión.

Puede que no sea tan elegante, pero es simple y funciona.


UH oh. Poner a su usuario remoto en el sudoersarchivo en un servidor como este es una catástrofe a la espera de suceder. Si alguien obtiene acceso como usuario (por ejemplo, a través del servidor web), puede convertirse inmediatamente en root. Gracias, pero estaba buscando soluciones que no pongan en conflicto la configuración de mi servidor. Si tuviera una solución, que de alguna manera reutilice mágicamente la autenticación de SSH para el sudocomando, estaría más interesado (y tal vez comenzaría a buscar reemplazos para SSH ...).
Boldewyn

@Boldewyn: sí, configurar "sudo sin contraseña" tiene ese riesgo de seguridad ... es un paso opcional. Estoy de acuerdo con usted, si SSH pudiera reutilizar la autenticación, este tipo de "soluciones" no serían necesarias. Gracias por tu comentario.
lepe

-1

Puede ejecutar el siguiente comando para obtener acceso de root sin interactividad:

ssh server " sudo command" < sudopassword.txt

1
Eso no funcionará porque stdin no será un dispositivo terminal (se leerá desde el archivo especificado).
Anthony G - justicia para Monica
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.