【问题标题】:Using Channels with Paramiko在 Paramiko 中使用通道
【发布时间】:2017-08-05 01:06:49
【问题描述】:

我正在将一个工具从 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 中使用 Channel 的原因是什么?

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()

【问题讨论】:

    标签: python paramiko


    【解决方案1】:

    如果SSH服务器支持运行命令(如ssh user@host "cmd; cmd; ..."),exec_command()就足够了。但是一些SSH服务器(例如交换机、路由器等网络设备)只支持启动交互式会话。那么你需要使用invoke_shell() 返回一个 Channel

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2023-04-02
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多