我想在 Python 的 Paramiko 模块中使用同一个 SSH 对象多次发出 exec_command()
。
目标是从同一 session 中获取输出。
有办法吗? exec_command()
一旦完成执行命令就会关闭 channel ,此后需要一个新的 ssh 对象来执行以下命令..但是 session 会有所不同,这是我不想要的。
代码
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'
>>>
最佳答案
一个 SSH session 确实可以有多个 channel (但 Paramiko possibly does not support it )。
但是通过 session ,您似乎会想象“shell session ”。但这不是 SSH session 。 channel 实际上对应于“shell session ”。
换句话说,即使您可以通过同一个 SSH 连接( session )使用 Paramiko 打开多个“exec” channel 并在这些 channel 上调用 exec_command
,这些命令也会在 不同的 shell session 。所以这对你没有帮助。
您可以使用 PuTTY SSH 客户端对此进行测试。最新版本支持connection sharing ,这基本上意味着您可以通过单个 SSH 连接/ session 拥有更多 PuTTY 窗口(每个窗口使用自己的 channel )。如果您在一个 PuTTY 窗口中执行命令,并且该命令更改环境(例如环境变量或当前工作目录),则更改不会反射(reflect)到另一个 PuTTY 窗口,即使它们共享相同的 SSH 连接。
<小时/>所以你需要在一个 channel 中执行命令。根据您的需求(目前还不清楚),您需要使用“exec”或“shell” channel 。
在任何一种情况下,您都很难确定一个命令的输出在哪里结束,另一个命令的输出在哪里开始,因为它们共享相同的“流”。
您可以通过在两者之间插入唯一的分隔符(字符串)并在 channel 输出流中搜索它来解决这个问题。
channel = ssh.invoke_shell()
channel.send('ls\n')
channel.send('echo unique-string-separating-output-of-the-commands\n')
channel.send('pwd\n')
关于python - 使用同一个 SSH 对象在 Paramiko 中多次发出 "exec_command()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30611230/