我使用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
答案 0 :(得分:0)
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()