【问题标题】:Interative shell paramiko how to read input like the exec_command交互式 shell paramiko 如何读取像 exec_command 这样的输入
【发布时间】:2016-08-27 13:39:31
【问题描述】:

在没有交互式 shell 的情况下使用 paramiko exec_command 时,很容易得到输出。

但是,我需要使用交互式 shell,而且读取单个命令的输出似乎很痛苦。我找不到演示或任何示例。

我尝试使用类似的东西:Implement an interactive shell over ssh in Python using Paramiko?

但它的状态非常糟糕。

【问题讨论】:

    标签: python paramiko


    【解决方案1】:

    使用链接中给出的解决方案后,“情况非常糟糕”是什么意思?

    输出中有一些不必要的字符,所以我删除了它们,请参阅edited解决方案。

    【讨论】:

    • 我认为它应该在一个类中,以便在任何地方都可以轻松重用。
    • 我同意,但几分钟内就可以轻松完成。如果您在将其设为类时遇到问题,请说出来,我将编辑代码。
    • 我根据您的要求更新了代码。现在它是一个完全可重用的类。
    • 是的更好,但我认为 _print_exec_out 根本没有真正的用处。使用 Logger 可能更好。
    • 你是对的,解决方案中不需要 _print_exec_out。我更新了代码。谢谢
    【解决方案2】:

    您不必为此使用paramiko

    只需使用paramiko 打开无密码ssh 连接,然后使用subporcess 模块实现您的方法。

    例如:

    def run_shell_remote_command(remote_host, remote_cmd):
            p = subprocess.Popen(['ssh', '-nx', remote_host, remote_cmd], stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            stdout, stderr = p.communicate()
            if p.returncode != 0:
                raise RuntimeError("%r failed, status code %s stdout %r stderr %r" % (
                    remote_cmd, p.returncode, stdout, stderr))
            return stdout.strip()  # This is the stdout from the shell command
    

    【讨论】:

    • 这样的问题是我必须按顺序运行很多命令,并且为每个命令打开一个进程太慢/没用。
    • 那么我猜一些 RPC 库可能适合您的需求。我用过python的RPyc。如果您有兴趣,我会在此处发布使用示例。
    • 你觉得在远程使用netcat并与之通信怎么样?
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2018-07-11
    • 2015-10-28
    • 2011-09-13
    • 2015-09-27
    • 2021-03-21
    • 2020-01-17
    相关资源
    最近更新 更多