小编典典

与Paramiko一起使用频道

python

我正在将工具从Ruby转换为Python,并且Ruby版本使用Net ::
SSH
连接到远程主机,并发送命令和检索响应/数据。我一直在Python副本中使用paramiko,但是对于paramikoChannels的用途感到困惑从到目前为止的内容来看,在我看来,一个通道(使用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()

阅读 209

收藏
2021-01-20

共1个答案

小编典典

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

TransportChannel 均为SSH术语(Paramiko除外)。有关更多信息,请参见以下RFC:

2021-01-20