【问题标题】:Use the same SSH object to issue "exec_command()" multiple times in Paramiko在 Paramiko 中使用同一个 SSH 对象多次发出“exec_command()”
【发布时间】:2015-06-03 05:05:34
【问题描述】:

我想在 Python 的 Paramiko 模块中使用同一个 SSH 对象多次发出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'
>>> 

【问题讨论】:

  • 您混淆了“频道”和“会话”。你到底想做什么? “从同一个会话中获取输出”是什么意思?
  • 嗨 Martin:我想要使用相同“ssh 对象”的命令的输出 - 这意味着相同的会话。会话可以有多个通道 - 对吧?我想一个接一个地发送命令,并确保输出正常。
  • 例如,如何在python中执行等价的:pwd cd .. pwd

标签: python ssh paramiko


【解决方案1】:

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

但是通过会话,您似乎可以想象“shell 会话”。但这不是 SSH 会话。通道其实就是一个“shell session”对应的东西。

换句话说,即使您可以通过同一个 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')

【讨论】:

  • 是的,获得了两个链接,但是如何在 Paramiko 的单个会话中执行多个命令? (Python)-> 不像答案声称的那样对我有用。它对来自 cmets 的更多人也不起作用。那么我该如何实现呢?如何打开外壳并执行?你的意思是,“shell”没有使用 paramiko?
  • 1) “不适合我” 非常含糊。你指的是什么cmets?我只看到一个。 2)我如何打开一个shell并执行?你按照我在回答中向你展示的那样去做,没有别的办法。 3) 你的意思是,“shell”没有使用 paramiko? 不明白你的意思。 4)如果你说得更详细,你想要达到的目标,你可能会得到更好的答案。
  • 我想通过 ssh 进入系统 - 使用“ssh_obj”发送命令 A 和 B。执行命令 A 后,我想解析它的输出,然后执行 B,然后解析它的输出。我不能在 A 和 B 之间进行 2 个不同的 ssh 会话 - 这就是为什么我看到是否可以使用相同的“ssh_obj”来执行命令 A 和 B。
  • 好的——按照你这里的代码,你如何解析“ls”的o/p?
  • 那么您的命令 A 以某种方式更改/准备命令 B 的环境?或者为什么你需要在同一个会话中执行它们?注意,您一直称它为 SSH 会话,但您的意思是 shell 会话。通常差异并不重要(因为每个 SSH 会话都有一个 shell 会话)。但在这种情况下,当我们谈论 SSH 通道时,它是至关重要的。
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 2011-03-29
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2019-09-09
相关资源
最近更新 更多