2012-04-19 16 views
15

Estoy intentando acceder a un servidor SSH y ejecutar algo como:entorno de conjunto SSH_ASKPASS variable o askpass en sudoers, resp

ssh [email protected] 'sudo echo "foobar"' 

Desafortunadamente Estoy consiguiendo un error:

sudo: no tty present and no askpass program specified 

Google me dijo que establezca la variable de entorno SSH_ASKPASS o que establezca askpass en el archivo sudoers. Mi equipo remoto está ejecutando en Debian 6 y he instalado los paquetes ssh-askpass y ssh-askpass-gnome y mi archivo sudoers se ve así:

Defaults  env_reset 
Defaults  askpass=/usr/bin/ssh-askpass 

# User privilege specification 
root ALL=(ALL) ALL 
user ALL=(ALL) ALL 

Puede alguien decir lo que soy haciendo mal y cómo hacerlo mejor.

Respuesta

18

Hay dos maneras de deshacerse de este mensaje de error. La manera más fácil es proporcionar un pseudo terminal para el proceso de sudo remoto. Usted puede hacer esto con la opción -t:

ssh -t [email protected] 'sudo echo "foobar"' 
+6

... y el camino difícil? –

+1

@ bradley.ayers: El problema es que 'sudo' quiere leer una contraseña de un tty. O bien proporciona un tty para sudo o evita la verificación de contraseña en sudo. Esto último es más difícil si quiere obtener seguridad. – nosid

+0

@nosid Gracias por esto. –

-3

Cómo sobre la adición de esto en el archivo sudoers:

user ALL=(ALL) NOPASSWD: ALL 
+3

Eso no es muy seguro. –

+1

Acepto, pero solo se recomienda para servidores que están bajo su control – Akshat

+3

Eliminar los requisitos de contraseña de sudo es malo. Es incluso peor si no especifica ninguna contraseña para los ejecutables "ALL". No es algo que deba considerar bien porque los servidores están bajo su control. Hay alternativas más seguras que no requieren cambios en el servidor en absoluto. –

1

EDITAR Dic 2013: Aquí hay una respuesta corta: tomar un día o dos para familiarizarse con la biblioteca de Python "Fabric". Fabric soluciona una tonelada de problemas con respecto al envío de tareas remotas a 1 o más servidores.

Probablemente aún desee configurar un nombre de usuario en el sistema de destino que pueda ejecutar comandos sin contraseña (¡y también puede usar Fabric para hacer eso!).

Solo tenga en cuenta que algunos aspectos de Fabric no son perfectamente Pythonic. Además, Fabric se diseñó primero con los administradores de sistemas en mente, personas que quieren agrupar comandos contra servidores. Si intenta hacer algo más (como automatizar algunos servidores o escenarios muy específicos), querrá comprender completamente cómo funciona "con la configuración" y/o el decorador @roles. No miré hacia atrás ...

(Y sí, recibí comandos SSH remotos que funcionan en sistemas "remotos". Es decir, el servidor A solicita al servidor B que se conecte al servidor C, y el retorno del comando es visto en el servidor A a pesar de que A no habla directamente con el servidor C. ¡Hace que la configuración del laboratorio sea más fácil!).

Respuesta original: Hay MUCHAS soluciones a este problema. Caballos de carreras; algunos son mejores que otros en diferentes situaciones.

La pregunta es cómo resolver el error "sin TTY". Ese parece ser el enfoque así que asumo que la conversación sobre sudoers es solo un intento de solución para evitar el problema de TTY.

Opción 1) La respuesta de Askhat funciona muy bien ... la mayoría de las veces. En realidad, siempre especifique "-tt" que funciona en más sistemas de destino.

Tenga en cuenta que seguirá teniendo problemas si está utilizando una biblioteca SSH como Paramiko, que no tiene una forma intuitiva de hacer "-t".

Opción 2) Mi respuesta es especificar un ASKPASS que es STDIN.Este ejemplo satisface tanto el requisito de contraseña de sudo como el TTY: $ shell> ssh [email protected] 'echo "contraseña" | sudo -S echo "foobar"'

Opción 3) Sí, puede desactivar sudo las contraseñas de todos o algunos usuarios, pero eso no es bueno en un servidor de producción.

Opción 4) Puede remota "requiretty" (o conjunto "! Requiretty" para todos o algunos usuarios en sudoers. Una vez más, no se enfríe en un cuadro de producción.

Es mejor evitar hacer cambios en el servidor. Algún día ese servidor será reemplazado, la configuración volverá a los valores predeterminados y su script dejará de funcionar.

Tenga en cuenta que una vez que comprende todas sus opciones, abre las puertas a mucha más automatización (por ejemplo, un script en su portátil que puede conectarse a una lista de nombres de host del servidor, y realizar tareas de sudo en esos servidores sin la necesidad de copiar dichos scripts en esos servidores).

5

En lugar de asignar un TTY o establecer una contraseña que se puede ver en la línea de comandos, haga algo como esto.

Crear un archivo de concha que se hacen eco de su contraseña como:

#!/bin/bash 

echo "mypassword" 

continuación, copia que al nodo que desee mediante scp así:

scp SudoPass.sh somesystem:~/bin 

Luego, cuando se ssh hacer lo siguiente:

ssh somesystem "export SUDO_ASKPASS=~/bin/SudoPass.sh;sudo -A command -parameter" 
+0

¿qué tal 'export SUDO_ASKPASS = 'echo' mypassword ''; sudo whatever_command'? No lo he probado, pero creo que debería funcionar ... – anishsane

+0

Esto no funciona para mí. Todavía obtengo: '$ SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "echo hola" 'la siguiente salida:' sudo: no se especificó el programa askpass, intente configurar SUDO_ASKPASS' –

+0

@white_gecko: porque no tiene exportada la variable de entorno. Pruebe: 'export SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "/ bin/true" ' – miklosq

2

Otra forma es ejecutar sudo -S con el fin de "escribir el símbolo para el error estándar y leer la contraseña de la entrada estándar en lugar de utilizar el dispositivo terminal" (de acuerdo con man) junto con cat:

cat | ssh [email protected] 'sudo -S echo "foobar"' 

entrada Sólo la contraseña cuando se le solicite a.

Una de las ventajas es que se puede redirigir la salida del comando a distancia para un archivo sin "contraseña [sudo] para ..." en ella:

cat | ssh [email protected] 'sudo -S tar c --one-file-system /' > backup.tar 
+0

Esto me acercó ... (en realidad se solicitó la contraseña), pero al escribir no se hizo nada. En cambio, obtuve '[sudo] contraseña para el nombre de usuario: Lo siento, intente de nuevo. Aparece automáticamente 3 veces y luego abandona. –

Cuestiones relacionadas