2010-05-26 17 views
20

Estoy tratando de usar Paramiko para conectarme a un host remoto y ejecutar una serie de sustituciones de archivos de texto.Paramiko y Pseudo-tty Asignación

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
           + replaced + "/g'" + conf); 

Algunos de estos comandos deben ejecutarse como sudo, que se traduce en:

sudo: lo siento, debe tener un TTY para ejecutar sudo

puedo forzar asignación de pseudo-tty con el modificador -t y ssh.

¿Es posible hacer lo mismo con paramiko?

Respuesta

14

Creo que desea que el método del objeto SSHClientinvoke_shell (me encantaría darle una dirección URL, pero los documentos paramiko en lag.net son frame-pesado y no me va a mostrar una URL específica para un punto dado en el documentos) - le da un Channel, en el que puede hacer exec_command y similares, pero lo hace a través de un pseudo-terminal (completo con tipo de terminal y números de filas y columnas! -) que parece ser lo que usted es preguntando por.

+4

Un enlace directo sin marco: http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html#invoke_shell. – tzot

+0

Tx, mucho mejor. –

22

El siguiente código funciona para mí:

#!/usr/bin/env python 
import paramiko 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('localhost',username='root',password='secret') 
chan = ssh.get_transport().open_session() 
chan.get_pty() 
chan.exec_command('tty') 
print(chan.recv(1024)) 

esto era sólo ensambla a partir de mirar algunos ejemplos en línea ... No estoy seguro si es la manera "correcta".

+2

Esta respuesta funcionó para mí cuando la respuesta aceptada no. ¡Gracias! – chown

5

De acuerdo con la página de manual sudo:

opción El -S (stdin) provoca sudo leer la contraseña de la entrada estándar en lugar del dispositivo terminal. La contraseña debe ir seguida de un carácter de nueva línea.

puede escribir a la entrada estándar, ya que es un objeto de archivo con escritura():

import paramiko 

client = paramiko.client.SSHClient() 
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) 
client.connect(hostname='localhost', port=22, username='user', password='password') 
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update') 
stdin.write('password\n') 
stdin.flush() 
# print the results 
print stdout.read() 
client.close() 
+0

Esto funcionó muy bien para mí y otras sugerencias no. –

32

En realidad es bastante simple. Simplemente:

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

Esa es la respuesta correcta. get_pty flag está haciendo lo mismo (ver exec_command del cliente) – Tom

+0

Gracias por salvarme el día :-) – shizhz

+0

funcionó muy bien para mí :-) – Tomas