Asignación de paramiko y pseudo-tty

Estoy tratando de usar Paramiko para conectarse a un host remoto y ejecutar varias sustituciones de archivos de texto.

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

Algunos de estos comandos deben ejecutarse como sudo, lo que resulta en:

sudo: lo siento, debes tener un tty para ejecutar sudo

Puedo forzar la asignación pseudo-tty con el modificador -t y ssh.

¿Es posible hacer lo mismo usando paramiko?

Related of "Asignación de paramiko y pseudo-tty"

Creo que quieres el método SSHClient objeto SSHClient (me encantaría dar una URL, pero los documentos de paramiko en lag.net son muy pesados ​​y no me mostrarán una URL específica para un lugar determinado en los 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 el tipo de terminal y números de filas y columnas! -) que parece ser lo que está pidiendo .

En realidad es bastante simple. Sólo:

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

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 se acaba de armar mirando algunos ejemplos en línea … no estoy seguro de que sea la forma “correcta”.

Según la página de manual de sudo:

La opción -S (stdin) hace que sudo lea 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 en la entrada estándar porque es un objeto de archivo con write ():

 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()