【发布时间】:2010-12-19 17:26:17
【问题描述】:
我正在编写一个使用 SSH 命令的 GUI。我尝试使用 subprocess 模块调用 ssh 并设置 SSH_ASKPASS 环境变量,以便我的应用程序可以弹出一个窗口询问 SSH 密码。但是,我无法使用给定的 SSH_ASKPASS 命令让 ssh 读取密码:它总是在终端窗口中提示它,无论我如何设置 DISPLAY、SSH_ASKPASS、TERM 环境变量或如何通过管道传输标准输入/输出。如何确保 ssh 与当前 TTY 分离并使用给定程序读取密码?
我的测试代码是:
#!/usr/bin/env python
import os
import subprocess
env = dict(os.environ)
env['DISPLAY'] = ':9999' # Fake value (trying in OS X and Windows)
del env['TERM']
env['SSH_ASKPASS'] = '/opt/local/libexec/git-core/git-gui--askpass'
p = subprocess.Popen(['ssh', '-T', '-v', 'user@myhost.com'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env
)
p.communicate()
【问题讨论】:
-
SSH 将始终在调用它的子进程中提示您,因此您需要做的是告诉
Popen()使用p.stdin.write()发送密码,或者只是简化整个该死的事情并使用一些东西用于已经为您编写的 SSH 交互,例如 Paramiko。 -
感谢您的回答。我尝试使用 p.stdin.write() 和 p.communicate() 发送密码,但是 ssh 仍然使用实际的 TTY 来读取密码……另一个问题是当 SSH 要求输入密码时不容易检测到(它可以使用不同的字符串来完成,这些字符串可以稍后出现在 SSH 会话等中)
-
看到您愿意自己将密码“写入”到 SSH 进程,我已经更新了我的答案,选择使用
pexcpet,这将适用。
标签: python ssh subprocess