Recuerda que en las ciencias informáticas cualquier problema casi siempre tiene diversas resoluciones, así que nosotros aquí compartiremos lo más óptimo y eficiente.
Solución:
Casos de uso no interactivos
Esto es un no interactivo ejemplo… envía cd tmp
, ls
y entonces exit
.
import sys
sys.stderr = open('/dev/null') # Silence silly warnings from paramiko
import paramiko as pm
sys.stderr = sys.__stderr__
import os
class AllowAllKeys(pm.MissingHostKeyPolicy):
def missing_host_key(self, client, hostname, key):
return
HOST = '127.0.0.1'
USER = ''
PASSWORD = ''
client = pm.SSHClient()
client.load_system_host_keys()
client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
client.set_missing_host_key_policy(AllowAllKeys())
client.connect(HOST, username=USER, password=PASSWORD)
channel = client.invoke_shell()
stdin = channel.makefile('wb')
stdout = channel.makefile('rb')
stdin.write('''
cd tmp
ls
exit
''')
print stdout.read()
stdout.close()
stdin.close()
client.close()
Casos de uso interactivos
Si tiene un caso de uso interactivo, esta respuesta no ayudará … Yo personalmente usaría pexpect
o exscript
para sesiones interactivas.
Estrictamente hablando, no se puede. De acuerdo con la especificación ssh:
Una sesión es una ejecución remota de un programa. El programa puede ser un shell, una aplicación, un comando del sistema o algún subsistema incorporado.
Esto significa que, una vez ejecutado el comando, la sesión finaliza. No puede ejecutar varios comandos en una sesión. Sin embargo, lo que PUEDE hacer es iniciar un shell remoto (== un comando) e interactuar con ese shell a través de stdin, etc. (piense en ejecutar un script de python en lugar de ejecutar el intérprete interactivo)
Intenta crear un comando string separado por n
personaje. Funcionó para mí. Para. p.ej ssh.exec_command("command_1 n command_2 n command_3")
Si aceptas, eres capaz de dejar un artículo acerca de qué te ha gustado de este enunciado.