Usando Canales con Paramiko

Estoy trabajando para convertir una herramienta de Ruby a Python, y la versión de Ruby usa Net :: SSH para conectarse a un host remoto y enviar comandos y recuperar respuestas / datos. He estado usando paramiko en la contraparte de Python, pero estoy confundido en cuanto al propósito de los canales en paramiko. Por lo que he leído hasta ahora, me parece que se usa un canal (que utiliza un transporte paramiko ) para mantener una conexión persistente a SSH en lugar de ejecutar un comando y luego terminar la conexión.

¿Se requiere un canal? ¿Cuál es la stack requerida para abrir una conexión SSH persistente a un host para enviar y recibir múltiples comandos de forma secuencial y obtener las respuestas, y luego, cuando termine, cierre la conexión manualmente?

Estas son las dos líneas principales que tengo problemas para traducir a Python, porque no estoy seguro de si un “Canal” de Ruby se asigna directamente a un “Canal” de paramiko:

@ssh_connection = Net::SSH.start(@linux_server_name, @server_user_name, :password => @password, :paranoid => false) 

y más tarde en el código

 @channel = @ssh_connection.open_channel do |new_channel| 

Edición: para explicar con más detalle mi pregunta, pude conectarme a un host remoto usando paramiko y ejecutar múltiples comandos secuenciales y obtener sus resultados sin usar un transporte o un canal, así que, ¿cuáles son las razones para usar un canal en paramiko?

 def connect(self): ssh_connection = paramiko.SSHClient() ssh_connection.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_connection.connect(self.linux_server_name) stdin, stdout, stderr = ssh_connection.exec_command("ls -l") print(stdout.readlines()) stdin, stdout, stderr = ssh_connection.exec_command("ls -l /tmp") print(stdout.readlines()) ssh_connection.close() 

exec_command() es suficiente si el servidor SSH admite comandos en ejecución (como ssh user@host "cmd; cmd; ..." . Pero algunos servidores SSH (por ejemplo, dispositivos de red como conmutadores, enrutadores, …) solo admiten el inicio de una función Luego debe usar invoke_shell() que devuelve un canal .

Transporte y Canal son todos términos SSH (distintos de los de Paramiko). Consulte las siguientes RFC para obtener más información:

  • rfc4251 – La architecture del protocolo SSH
  • rfc4252 – El Protocolo de Autenticación SSH
  • rfc4253 – El protocolo de la capa de transporte SSH
  • rfc4254 – El protocolo de conexión SSH