【发布时间】:2012-10-14 01:14:01
【问题描述】:
我正在编写一个 GUI 程序来为一群害怕使用命令行的用户生成和监控 SSH 隧道。
不幸的是,有问题的服务器非常严格。通过 RSA SecurID 令牌进行的双重身份验证是唯一官方认可的打开 SSH 连接的方式。不允许无密码的 RSA 公钥/私钥身份验证。
因此,我的程序有必要从文本输入框中读取密码并将其发送给子 SSH 进程。不幸的是,ssh 竭尽全力确保密码仅来自真正的键盘。
我强烈不喜欢使用第三方模块。我知道 paramiko 和 pexpect(它们都被提出来作为类似问题的可能解决方案),但是试图向我的用户解释如何从源代码安装 Python 模块太让人头疼了。
那么:如何仅使用标准 python subprocess 模块向 ssh 子进程发送密码?有什么办法可以让子进程误以为我在使用 TTY?是否可以使用 SSH_ASKPASS 读取我的程序?
也允许使用其他标准库模块(例如,带有 os 模块的低级命令)。
【问题讨论】:
-
大多数情况下,您只需将模块的源目录从 tarball 中拉出并与您自己的脚本一起打包,这样就无需安装它。
-
我同意 pexpect 是完成这项工作的工具。您还可以考虑使用 PyInstaller,它将依赖项(和解释器)捆绑成可执行形式。
-
我认为你可以通过
ssh -T和SSH_ASKPASS获得成功,这似乎正是为此目的而发明的。 -
您需要使用 pty 将其作为子进程运行。您可以使用 os.openpty() 和那里的其他功能“自己动手”。
-
@mlefavor:不,但您可以提供与父进程通信的外部二进制文件。不好的是,无论我怎么尝试,到目前为止我都没有让 SSH 使用 SSH_ASKPASS。