python - invoke_shell - Asignación de paramiko y pseudo-tty
python ssh paramiko tutorial (4)
Creo que quieres el método SSHClient
objeto SSHClient
(me gustaría dar una URL, pero los documentos de lag.net en lag.net son muy pesados y simplemente no mostrarán una URL específica para un lugar determinado en los documentos) - te da un Channel
, en el que puedes exec_command
y exec_command
, pero lo haces a través de un pseudo-terminal (¡completo con tipo de terminal y números de filas y columnas! -) que parece ser lo que estás pidiendo .
Intento usar Paramiko para conectarme a un host remoto y ejecutar una serie de 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 da como resultado:
sudo: lo siento, debes tener un tty para ejecutar sudo
Puedo forzar la asignación de pseudo-tty con el modificador -t y ssh.
¿Es posible hacer lo mismo usando paramiko?
De acuerdo con la página 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 ser seguida por un carácter de nueva línea.
Puede escribir en el stdin 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()
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 formó simplemente mirando algunos ejemplos en línea ... no estoy seguro si es la manera "correcta".
En realidad es bastante simple. Sólo:
stdin, stdout, stderr = client.exec_command(command, get_pty=True)