使用相同的SSH对象在Paramiko

时间:2015-06-03 05:05:35

标签: python ssh paramiko

我希望使用相同的SSH对象在Python的Paramiko模块中多次发出exec_command()

目标是从同一会话中获取输出。

有办法吗? exec_command()一旦完成执行命令就会关闭通道,然后需要一个新的ssh对象来执行以下命令..但是会话会有所不同,这是我不想要的。

代码

import os, sys, 
import connectlibs as ssh
s = ssh.connect("xxx.xx.xx.xxx", "Admin", "Admin")
channel = s.invoke_shell()
channel.send("net use F: \\\\xyz.xy.xc.xa\\dir\n")
>>>32
channel.send("net use")
>>>7
channel.recv(500)
'Last login: Tue Jun  2 23:52:29 2015 from xxx.xx.xx.xx\r\r\n\x1b]0;~\x07\r\r\n\x1b[32mAdmin@WIN \x1b[33m~\x1b[0m\r\r\n$ net use F: \\\\xyz.xy.xc.xa\\dir\r\nSystem error 67 has occurred.\r\r\n\r\r\nThe network name cannot be found.\r\r\n\r\r\n\x1b]0;~\x07\r\r\n\x1b[32mAdmin@WIN \x1b[33m~\x1b[0m\r\r\n$ net use'
>>> 

1 个答案:

答案 0 :(得分:1)

SSH会话确实可以有多个频道(但是Paramiko possibly does not support it)。

但是通过一个会话,你似乎想象一个“shell会话”。但这不是SSH会话的内容。实际上是一个通道,对应于“shell会话”。

换句话说,即使您可以通过相同的SSH连接(会话)打开Paramiko的多个“exec”通道并在这些通道上调用exec_command,命令也会在不同的shell会话中执行。所以它对你没有帮助。

您可以使用PuTTY SSH客户端进行测试。最近的版本支持connection sharing,这基本上意味着您可以通过单个SSH连接/会话拥有更多PuTTY窗口(每个窗口都使用自己的通道)。如果在一个PuTTY窗口中执行命令,并且命令更改了环境(如环境变量或当前工作目录),则更改将不会反映到其他PuTTY窗口,即使它们共享相同的SSH连接也是如此。

因此您需要在一个通道中执行命令。根据您的需要(仍然不清楚),您需要使用“exec”或“shell”频道。

在任何一种情况下,你都会遇到麻烦,一个命令的输出结束,另一个命令的输出开始,因为它们共享相同的“流”。

您可以通过在其间插入唯一的分隔符(字符串)并在频道输出流中搜索它来解决此问题。

channel = ssh.invoke_shell()
channel.send('ls\n')
channel.send('echo unique-string-separating-output-of-the-commands\n')
channel.send('pwd\n')