【发布时间】: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()
【问题讨论】: