如何强制 SSH 使用图形提示(例如 GTK)而不是使用终端的标准提示请求密码?
我试过设置,SSH_ASKPASS=/usr/bin/ssh-askpass但似乎没有效果。
问题是 openssh 文档说的事实
如果 ssh没有与之关联的终端,但设置了 DISPLAY 和 SSH_ASKPASS,它将执行 SSH_ASKPASS 指定的程序并打开 X11 窗口以读取密码。
在命令行启动,在我的情况下的结果的SSH git push,将具有与其相关联的终端,所以SSH_ASKPASS逻辑似乎被忽略。
请注意,我指的不是ssh-add,而是针对存在密钥对但受密码保护的主机的通用 ssh 调用。
slm*_*slm 38
您可能缺少包含ssh-askpass. 尝试安装它。
Fedora/CentOS/RHEL:
$ sudo yum install openssh-askpass
Run Code Online (Sandbox Code Playgroud)
Debian/Ubuntu:
$ sudo apt-get install ssh-askpass-gnome ssh-askpass
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令搜索丢失的工具:
Fedora/CentOS/RHEL:
$ yum search ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
======================================================= Matched: ssh-askpass =======================================================
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
connect-proxy.x86_64 : SSH Proxy command helper
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X
Run Code Online (Sandbox Code Playgroud)
Debian/Ubuntu:
$ apt-file -l search ssh-askpass
app-install-data
cruft
git-cola
luckybackup-data
pssh
sdm-terminal
seahorse
ssh-askpass
ssh-askpass-fullscreen
ssh-askpass-gnome
Run Code Online (Sandbox Code Playgroud)
我最初错过了这一点,但在进一步阅读后,我在ssh有关SSH_ASKPASS环境变量的手册页中注意到了这条评论。
摘抄
SSH_ASKPASS If ssh needs a passphrase, it will read the passphrase from the
current terminal if it was run from a terminal. If ssh does not
have a terminal associated with it but DISPLAY and SSH_ASKPASS
are set, it will execute the program specified by SSH_ASKPASS
and open an X11 window to read the passphrase. This is particularly
useful when calling ssh from a .xsession or related script.
(Note that on some machines it may be necessary to redirect the
input from /dev/null to make this work.)
Run Code Online (Sandbox Code Playgroud)
如果您在评论中注意到,它指出 ssh “没有关联的终端” AND DISPLAY &SSH_ASKPASS已设置。注意到这一点很关键。所以要开始ssh使用SSH_ASKPASS我们需要ssh没有终端(又名。STDIN& STDOUT)连接到它。
通过使用命令来做到这一点的一种方法setsid。不要感觉不好。我也从来没有听说过这个工具。从手册页:
setsid - 在新会话中运行程序
因此,如果我们ssh作为“程序”运行,setsid我们可以ssh从满足ssh手册页中提到的标准的终端中分离出来。其他标准设置如下:
$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass
Run Code Online (Sandbox Code Playgroud)
所以如果我们把这一切放在一起:
$ setsid ssh user@remotehost
Run Code Online (Sandbox Code Playgroud)
例如:
$ setsid ssh user@skinner
Run Code Online (Sandbox Code Playgroud)

如果您想让它成为setsid“内置”,您可以像这样创建别名:
$ alias ssh="setsid ssh"
Run Code Online (Sandbox Code Playgroud)
现在,当您ssh弹出 GUI 要求输入密码时:
$ ssh user@skinner
Run Code Online (Sandbox Code Playgroud)
thg*_*thg 10
只花了 19 年时间就解决了这个问题OpenSSH Bug 69 - genericized-askpass。
OpenSSH 8.4 将包含一个 $SSH_ASKPASS_REQUIRE 变量,该变量接受 force|prefer|never 选项。
当我将 SSH_ASKPASS_REQUIRE 设置为首选时,ssh-add将从终端启动 ssh-askpass 用户界面。在我的 Arch Linux 机器上,我的目录中有以下内容.xinitrc
export SSH_ASKPASS=/usr/lib/ssh/x11-ssh-askpass
export SSH_ASKPASS_REQUIRE=prefer
eval `keychain --eval --noask ~/.ssh/id_rsa`
Run Code Online (Sandbox Code Playgroud)
在我的~/.ssh/config我有
AddKeysToAgent yes
Run Code Online (Sandbox Code Playgroud)
因此,当我在重新启动后第一次在我的一个项目中运行eg时git pull,askpass对话框将正确弹出并仅询问一次密码。
希望有帮助。
在当前的 OpenSSH 中无法完成:自 2013-07 年起,OpenSSH Bugzilla 中存在一个要求此功能的问题:Generalize SSH_ASKPASS。
小智 5
有一种方法可以关闭单个命令的终端,那就是使用文件重定向:
ssh-add > /dev/null < /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
这将ssh-add在终端关闭的情况下运行命令。这很好,很花哨,除了它的复杂性。但是现在您知道正确的命令,只需将其设为别名并将其附加到~/.bash_aliases:
alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"
Run Code Online (Sandbox Code Playgroud)
你应该被设置。ssh-add现在只需键入将调用别名,该别名将调用具有所有重定向的真实命令。
在ssh-add现在正确地问你一个对话框,密码......只要你有这些软件包安装(在Ubuntu或衍生物,它们可能有其他地方的名称)中的一种:
ssh-askpassssh-askpass-fullscreenssh-askpass-gnomeksshaskpathkwalletclilxqt-openssh-askpassrazorqt-openssh-askpasss现在,所有这些是什么意思?
这2>&1意味着将文件描述符 #2(标准错误)重定向到文件描述符 #1(标准输出)指向的同一位置。
这> /dev/null意味着将标准输出重定向到/dev/null,这是一个丢弃所有写入其中的数据的特殊文件。
这< /dev/null意味着将标准输入重定向到/dev/null(同上)。
作为旁注,以及与主题无关但相关的说明,如果您想在 bash 中对服务进行编程,您必须记住服务实际上是什么,一个在后台具有标准输入、输出和错误关闭的进程:
service > /dev/null < /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)
请注意,唯一的区别是在末尾添加了 &(加上我更改ssh-add了理论命令的事实service。这些命令将正确地将服务置于后台。