我正在编写一个使用SSH命令的GUI。我试图使用subprocess模块来调用ssh并设置SSH_ASKPASS环境变量,以便我的应用程序可以弹出一个窗口询问SSH密码。但是我无法使用给定的SSH_ASKPASS命令使ssh读取密码:无论我如何设置DISPLAY,SSH_ASKPASS,TERM环境变量或如何管理标准输入/输出,它总是在终端窗口中提示它。我如何确保ssh与当前的TTY分离并使用给定的程序来读取密码?如何通过subprocess模块调用ssh,以便它使用SSH_ASKPASS变量
我的测试代码为:
#!/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', '[email protected]'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env
)
p.communicate()
SSH将始终在调用它的子进程中提示你,所以你需要做的是告诉'Popen()'通过使用'p.stdin来发送密码。write()'或者简化整个该死的事情,并使用已经为你写的SSH交互的东西,比如Paramiko。 – jathanism 2009-11-24 02:06:33
感谢您的回答。我尝试使用p.stdin.write()和p.communicate()发送密码,但仍然使用实际的TTY读取密码......另一个问题是,在SSH询问密码时不容易检测(可以使用不同的字符串,这可以在SSH会话中稍后出现,等等) – gyim 2009-11-24 09:31:44
看到您愿意将密码自己写入SSH进程,我已经使用选项更新了我的答案'pexcpet',这将为此工作。 – abyx 2009-11-24 10:03:15