【问题标题】:Using subprocess to execute a linux command in python and then grab the resulting prompt使用 subprocess 在 python 中执行 linux 命令,然后获取结果提示
【发布时间】:2023-04-05 22:14:01
【问题描述】:

我正在使用 subprocces.Popen() 在 python 中运行 linux 命令。 我正在尝试使用此命令 ssh 到另一台机器,并查看它是否提示我输入密码。

但是,我不知道如何获取结果提示并在 python 脚本中使用它。

例如,如果我使用 subprocess.Popen() 调用命令“echo Hello World”,那么我可以使用communicate() 方法从运行该命令中获取生成的标准输出。

但这是我想要做的: 使用 Popen() 运行: ssh -hostname- 'echo Hello' 然后获取结果以在 python 脚本中使用。因此,如果 ssh 遇到密码提示,我希望能够在 python 脚本中将该提示的输出用作字符串。最后,我希望能够退出这个提示(相当于在使用 linux 终端时输入 ^C)。但是,当使用 Popen() 和communicate() 时,它只是在实际的 linux 标准输出上显示提示,并没有抓取提示。

我还希望禁止在实际的 linux 终端标准输出上显示此提示。

这是我一直在使用的代码(该代码在获取普通标准输出时有效):

p = subprocess.Popen(["ssh", hostName, "echo Hello"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
sshOutput, err = p.communicate()

当然,密码提示没有存储在 sshOutput 中,这就是问题所在。如果我运行以下命令,结果将是一个包含“Hello”的字符串

p = subprocess.Popen(["echo", "Hello"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result, err = p.communicate()

【问题讨论】:

  • 听起来你想要 pexpect 但你能给出一个实际例子来说明你在谈论什么输出吗?
  • 我编辑了这个问题,并完整解释了我想要做什么以及它实际上做了什么。
  • 对不起,我还是不太明白。你到底想得到什么?
  • 我相信 OP 要求重定向标准输出,以便脚本可以解析“密码:”等。
  • 假设没有设置无密码 ssh,当您尝试 ssh 到另一台机器时,系统会首先提示您输入密码。我希望能够获取该提示的文本并在调用 ssh 命令的 python 脚本中使用它。就像我有一个运行命令“ls”然后抓取输出并在脚本中使用它的 python 脚本一样,我希望能够抓取该密码提示输出。

标签: python linux subprocess popen prompt


【解决方案1】:

问题是 ssh 打印提示并从当前 tty 读取密码,而不是 stdout/stdin。见this question

可能的解决方案:

  • 将 ssh 的标准输入和标准输出连接到从属 pty 并从您的应用程序读取/写入主 pty。您可以使用 expectpexpect(在 Python 中)。
  • 在某个包装程序中运行 ssh,该程序将在它的 stdin/stdout 和 ssh 的 stdin/stdout 之间插入一个 pty。也许unbuffer 会起作用。在这种情况下,您可以继续使用subprocess
  • 使用sshpass。您也可以将其与 subprocess 一起使用。

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2016-03-21
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多