如何强制 SSH 使用图形提示(例如 GTK)而不是使用终端的标准提示来请求密码?
我尝试过设置SSH_ASKPASS=/usr/bin/ssh-askpass
,但似乎没有效果。
问题是 openssh 文档说的事实
如果是SSH没有与之关联的终端如果设置了 DISPLAY 和 SSH_ASKPASS,它将执行 SSH_ASKPASS 指定的程序并打开 X11 窗口来读取密码。
从命令行启动 ssh,在我的例子中,结果是git push
,将要有一个与之关联的终端,因此SSH_ASKPASS
逻辑似乎被忽略了。
请注意,我指的不是 SSH ssh-add
,而是对存在密钥对但受密码保护的主机的通用 ssh 调用。
答案1
#1 - 包裹丢失?
您可能缺少包含ssh-askpass
.尝试安装它。
Fedora/CentOS/RHEL:
$ sudo yum install openssh-askpass
Debian/Ubuntu:
$ sudo apt-get install ssh-askpass-gnome ssh-askpass
寻找缺失的实用程序
您可以使用以下命令搜索丢失的工具:
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
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
#2 - 终端断开?
我最初错过了这一点,但在进一步阅读后,我注意到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.)
如果您在评论中注意到,它指出 ssh“没有关联的终端”和 DISPLAY
&SSH_ASKPASS
已设置。注意到这一点是关键。因此,要ssh
使用它SSH_ASKPASS
,我们需要ssh
不连接终端(又名“ STDIN
& STDOUT
”)。
一种方法是使用命令来做到这一点setsid
。别难过。我也从未听说过这个工具。从手册页:
setid - 在新会话中运行程序
因此,如果我们ssh
作为“程序”运行,我们就可以从符合手册页中提到的标准的终端中setsid
分离出来。其他标准设定如下:ssh
ssh
$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass
因此,如果我们将所有这些放在一起:
$ setsid ssh user@remotehost
例如:
$ setsid ssh user@skinner
一个办法
如果您想使其成为setsid
“内置”,您可以创建一个别名,如下所示:
$ alias ssh="setsid ssh"
现在,当您ssh
将弹出 GUI 并询问您的密码时:
$ ssh user@skinner
参考
答案2
解决这个问题只用了19年OpenSSH Bug 69 - 通用询问密码。
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`
在我的~/.ssh/config
我有
AddKeysToAgent yes
因此,当我在重新启动后第一次在我的一个项目中运行eg时git pull
,askpass对话框将正确弹出并仅询问一次密码。
希望有帮助。
答案3
在 8.4 版本之前的 OpenSSH 中无法完成此操作:有关详细信息,请阅读 OpenSSH Bugzilla 中自 2002 年以来要求此功能并最终于 2021 年 1 月修复的问题:概括 SSH_ASKPASS。
对于 OpenSSH 版本 8.4+,请参阅接受的答案快速解释如何使用 来实现这一点SSH_ASKPASS_REQUIRE
。
答案4
当我在 ArchLinux 上安装 Seahorse (提供seahorse-ssh-askpass
)而没有安装软件包时,我遇到了同样的问题。gnome-keyring
查看这个包的内容gnome-keyring
(https://www.archlinux.org/packages/extra/i686/gnome-keyring)可以帮助您解决您的问题。
无论如何,如果您不介意使用 seahorse,您还可以安装软件包seahorse
和gnome-keyring
(或您的发行版的等效软件包)。如果您不使用 Gnome,则可能需要执行其他步骤:https://wiki.archlinux.org/index.php/GNOME_Keyring。