强制 ssh 始终使用 SSH_ASKPASS

强制 ssh 始终使用 SSH_ASKPASS

我想强制 ssh 始终使用 指定的程序SSH_ASKPASS。就我而言,该程序只是一个返回密码的 bash 脚本。

问题是,正如 ssh 文档所述:

如果 ssh 需要密码,如果它是从终端运行的,它将从当前终端读取密码

因此,如果我从终端运行 ssh,SSH_ASKPASS则会被忽略。

还有一个类似的问题: 告诉 SSH 使用图形提示输入密钥密码

建议为 ssh 创建一个别名,如下所示

$ alias ssh="setsid ssh"

但对我不起作用,因为我不直接调用 ssh,而是从 git 或 rsync 调用。

我还找到了一个开放问题在 OpenSSH Bugzilla 中要求修复,但它是在 2002 年开放的,所以我不相信它会被实现。

我正在考虑可能奇怪的解决方案:

  1. 制作一个假的 ssh 代理,它调用脚本并返回密码。
  2. 创建一个进程来查找新的 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通常会被取消设置。

相关内容