【问题标题】:Paramiko channel gets disconnected after executing one commandParamiko 频道在执行一个命令后断开连接
【发布时间】:2014-12-30 01:06:20
【问题描述】:

我使用 Paramiko 模块访问我的服务器,但我面临的问题是执行一个命令后通道断开。我希望通道打开,直到我完成执行更多命令。运行两个通道并不能解决我的问题,因为在第一个通道中我更改了目录并希望在同一个更改的目录中运行下一个命令。

import paramiko


ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('xx.xx.xx.xx', username='abc', password='abc')


chan = ssh.get_transport().open_session()
chan.settimeout(10800)
chan1 = ssh.get_transport().open_session()
chan1.settimeout(10800)

chan.exec_command('uptime')
chan1.exec_command('who')
data = chan.recv(4096)
print data
data1 = chan1.recv(4096)
print data1

【问题讨论】:

  • 如果您尝试自动化远程服务器命令,您可能会更喜欢fabric,它在paramiko 之上公开了更高级别的API

标签: python ssh paramiko channel


【解决方案1】:

Paramiko "exec_command" API 总是在执行后打开新通道,并在命令执行完成后终止通道。

我认为您仍然可以更改一个通道命令导致第二个通道命令,因为它最后是在同一个 SSH 会话上。可能,您可能需要在两个命令执行之间添加一些延迟。但是,如果你不这样做..别担心.. paramiko 有解决方案来运行尽可能多的命令

这里是 paramiko 的 interactive_shell 函数

def interactive_shell():
transport = paramiko.Transport(("1.1.1.1",22))
transport.connect(username="abcd", password="abcd")
#chan = paramiko.transport.open_session()
chan = transport.open_session()
chan.setblocking(0)
chan.invoke_shell()
chan.send("uptime")
chan.send("who")
time.sleep(1)  #optional
while not chan.exit_status_ready() :
    if chan.recv_ready() :
        output = chan.recv(8192)
        if len(output) > 0 :
           print output
    if chan.recv_stderr_ready() :
        mystderr = chan.recv_stderr(8192)
        if len(mystderr) > 0 :
            print mystderr

transport.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多