Usando canais com o Paramiko

Eu estou trabalhando na conversão de uma ferramenta de Ruby para Python, ea versão Ruby usa Net :: SSH para se conectar a um host remoto e enviar comandos e recuperar respostas / dados. Eu tenho usado o paramiko na contraparte do Python, mas estou confuso quanto ao propósito dos canais em paramiko. Pelo que li até agora, parece-me que um canal (que usa um paramiko Transport ) é usado para manter uma conexão persistente com o SSH em vez de executar um comando e terminar a conexão.

Um canal é necessário? Qual é a pilha necessária para abrir uma conexão SSH persistente a um host para enviar e receber vários comandos sequencialmente e obter as respostas e, quando terminar manualmente, fechar a conexão?

Estas são as duas principais linhas que estou tendo dificuldade em traduzir para o Python, porque não tenho certeza se um “Canal” Ruby mapeia diretamente para um paramiko “Canal”:

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

e mais tarde no código

 @channel = @ssh_connection.open_channel do |new_channel| 

Editar: Para explicar melhor a minha pergunta, consegui me conectar a um host remoto usando paramiko e executar vários comandos sequenciais e obter seus resultados sem usar um transporte ou um canal, então, novamente, quais são os motivos para usar um canal em 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() é suficiente se o servidor SSH suportar comandos em execução (como ssh user@host "cmd; cmd; ..." . Mas alguns servidores SSH (por exemplo, dispositivos de rede como switches, roteadores, …) suportam apenas iniciar um interativo Então você precisa usar invoke_shell() que retorna um canal .

Transporte e Canal são todos os termos SSH (exceto os da Paramiko). Veja os seguintes RFCs para mais informações:

  • rfc4251 – A arquitetura do protocolo SSH
  • rfc4252 – O protocolo de autenticação SSH
  • rfc4253 – O protocolo da camada de transporte SSH
  • rfc4254 – O protocolo de conexão SSH