python - 使用子进程在python中执行一个linux命令,然后抓取结果提示

标签 python linux subprocess popen prompt

我正在使用 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 stdout 上显示提示,而不是获取提示。

我还希望禁止在实际的 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()

最佳答案

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

可能的解决方案:

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

关于python - 使用子进程在python中执行一个linux命令,然后抓取结果提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31550137/

相关文章:

python - 有没有办法在Python中运行一个在后台打开窗口的子进程?

从模块导入函数而从另一个模块导入类时出现 Python 导入错误 (ModuleNotFoundError)

python - 在 python 中跟踪索引的正确方法是什么?

python - 从上传创建新文件

linux - 比 wc -l 更快更精确地计算行数的方法

python - ImportError:Python 2.7.13 中没有名为 _tkinter 的模块

python - 使用 Popen 运行本地二进制文件时出现“找不到文件”错误

python - 使用 NLTK 和德语语料库从名词中获取性别

python - 从平面文件中解析出数据

linux - 我可以在升级主机后运行 Docker 容器吗?