python - 使用同一个 SSH 对象在 Paramiko 中多次发出 "exec_command()"

标签 python ssh paramiko

我想在 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/

相关文章:

python - 我如何在Python中的函数内使用内部迭代?

linux - 通过 ssh 编写 sudo 脚本

linux - 无法通过 ssh 成功声明 -f

Ruby - 如何启动 ssh session 并将用户转储到其中 - 没有 Net::SSH

python - 使用 Paramiko 在 Python 中通过 ssh 实现交互式 shell?

linux - 使用 paramiko ssh channel 以 root 权限运行远程程序

python - 更改 Gtk.Button 标签的样式/字体

python - pySerial 非常奇怪的行为...代码在 shell 中执行时有效,但在脚本中无效

python - Python 3 无法识别 Paramiko

python - 在多个内核上运行进程可能会导致 python 性能下降?