2011-04-26 37 views
5

He estado buscando en las redes durante algún tiempo para encontrar una solución a mi problema, y ​​no tuve suerte.Paramiko y sudo

Mi problema es que parece que no puedo obtener los comandos sudo para ejecutar con paramiko.

Al principio, traté de simplemente utilizar la función (comandos) SSHClient() exec_command para ejecutar un comando sudo, pero esta errores:.

sudo: sorry, you must have a tty to run sudo 

Entonces, siguiendo el consejo de este post: How to make a sudo command using Paramiko, he intentado esto:

#self._ssh is the SSHClient object  
self._ssh.invoke_shell().exec_command(command) 

Sin embargo, la mayoría de las veces, esto sólo me da:

File "pipelines/load_instance/ssh_tools.py", line 71, in executeCommand 
    stdin, stdout, stderr = self._ssh.invoke_shell().exec_command(command) 
    File "<absolute_path>/paramiko/channel.py", line 213, in exec_command 
    self._wait_for_event() 
    File "<absolute_path>/paramiko/channel.py", line 1084, in _wait_for_event 
    raise e 
paramiko.SSHException: Channel closed. 

El otro, tendría que decir, el 40% de las veces, me sale esto:

File "<absolute_path>/paramiko/client.py", line 291, in connect 
    sock.connect(addr) 
File "/usr/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
socket.error: [Errno 111] Connection refused 

Como nota al margen, Estoy intentando ejecutar estos comandos sudo en una instancia EC2 Amazon Web Services, así que estoy confundido sobre por qué obtendría el error Connection Refused, ya que cada vez que ejecuto este código está en una nueva instancia ...

Además, estoy usando paramiko 1.7.6.

Respuesta

3

Este es un problema común en distribuciones recientes e impacta más que solo paramiko. (Me encontré con él el otro día cuando actualicé una caja de fedora2 a la última. Varios scripts de administración ssh/sudo se rompieron)

Siempre y cuando tenga acceso al host remoto, puede editar /etc/sudoers y comentar la línea : Defaults requiretty

Detalles en el sudoers man page:

requiretty

Si se establece, sudo sólo se ejecutará cuando el usuario se registra i n a un tty real. Este no permitirá cosas como "rsh somehost sudo ls", ya que rsh (1) no asigna tty. Como no es posible desactivar el eco cuando no está presente, algunos sitios pueden con establecer este indicador para evitar que un usuario ingrese una contraseña visible. Esta bandera está desactivada de forma predeterminada.

+1

Hola J.J., tengo exactamente el mismo problema que kand. Si entiendo este derecho, entonces eliminar el indicador requiretty debería resolver el problema. Sin embargo, sigo teniendo la misma stack stack que la anterior. ¿Qué estoy haciendo mal? (Disculpa si este es el lugar equivocado para preguntar) – Patrick

+0

Sí, la misma pregunta aquí. Esto realmente no resuelve el problema para mí, y eventualmente esa línea ni siquiera está en el archivo/etc/sudoers por defecto. – lpapp

0
stdin, stdout, stderr = client.exec_command(cmd, get_pty=True) 
+0

Considera agregar una descripción de tu código. Ayudará a los futuros usuarios que visiten esta publicación. –