使用Paramiko频道

时间:2017-08-04 13:32:02

标签: python paramiko

我正在努力将工具从Ruby转换为Python,而Ruby版本使用Net::SSH连接到远程主机,并发送命令并检索响应/数据。我一直在Python对应的paramiko,但我对Channels in paramiko.的目的感到困惑。从我到目前为止所读到的,在我看来,一个频道(使用paramiko Transport )用于保持与SSH的持久连接,而不是执行命令然后终止连接。

是否需要频道?打开与主机的持久SSH连接以顺序发送和接收多个命令并获得响应所需的堆栈是什么,然后在手动关闭连接时完成?

这是我在转换为Python时遇到问题的两条主线,因为我不确定Ruby“频道”是否直接映射到paramiko“频道”:

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

以及稍后的代码

@channel = @ssh_connection.open_channel do |new_channel|

编辑:为了进一步解释我的问题,我能够使用paramiko连接到远程主机并执行多个顺序命令并在不使用传输或通道的情况下获得结果,所以再次,什么在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()

1 个答案:

答案 0 :(得分:2)

如果SSH服务器支持运行命令(如exec_command()),则

ssh user@host "cmd; cmd; ..."就足够了。但是某些SSH服务器(例如交换机,路由器等网络设备)仅支持启动交互式会话。您需要使用invoke_shell()来返回频道

传输频道都是SSH术语(Paramiko除外)。有关详细信息,请参阅以下RFC: