执行一条命令后Paramiko通道断开连接

1 投票
1 回答
2320 浏览
提问于 2025-05-01 07:03

我使用了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
暂无标签

1 个回答

0

Paramiko的“exec_command”功能每次执行命令时都会打开一个新的通道,并在命令执行完成后关闭这个通道。

我觉得你还是可以让一个通道的命令结果影响到第二个通道的命令,因为它们毕竟是在同一个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()

撰写回答