我想强制 ssh 始终使用 指定的程序SSH_ASKPASS
。就我而言,该程序只是一个返回密码的 bash 脚本。
问题是,正如 ssh 文档所述:
如果 ssh 需要密码,如果它是从终端运行的,它将从当前终端读取密码。
因此,如果我从终端运行 ssh,SSH_ASKPASS
则会被忽略。
还有一个类似的问题: 告诉 SSH 使用图形提示输入密钥密码
建议为 ssh 创建一个别名,如下所示
$ alias ssh="setsid ssh"
但对我不起作用,因为我不直接调用 ssh,而是从 git 或 rsync 调用。
我还找到了一个开放问题在 OpenSSH Bugzilla 中要求修复,但它是在 2002 年开放的,所以我不相信它会被实现。
我正在考虑可能奇怪的解决方案:
- 制作一个假的 ssh 代理,它调用脚本并返回密码。
- 创建一个进程来查找新的 ssh 进程,并在 ssh 要求输入密码之前将它们与终端分离。
有更好的建议吗?
答案1
每个ssh
手册:
如果
ssh
没有与其关联的终端,但设置了 DISPLAY 和 SSH_ASKPASS,它将执行 SSH_ASKPASS 指定的程序。
因此,您需要取消与终端的关联(例如通过添加管道)并确保DISPLAY
未设置(如果您想使用终端作为密码短语)。
简单的例子:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
与以下相同ssh-add
:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
答案2
不幸的是,我无法访问您链接的未解决问题,但我已经尝试过@npostavs' 建议(设置DISPLAY
为某个值),它似乎有效1。
例如:
# List heads in a remote git repo
DISPLAY=: setsid git ls-remote -h [email protected]:NFL/tests.git
在哪里
$ cat ${SSH_ASKPASS}
#!/bin/bash
echo ABCSuperPassword
在此示例中,SSH_AGENT
由 git 调用(设置GIT_TRACE=2
为详细输出),有效地提供“ABC超级密码” 作为私钥的密码。
笔记
DISPLAY
如果登录到远程终端,1通常会被取消设置。