告诉 SSH 使用图形提示输入密钥密码

告诉 SSH 使用图形提示输入密钥密码

如何强制 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分离出来。其他标准设定如下:sshssh

$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass

因此,如果我们将所有这些放在一起:

$ setsid ssh user@remotehost

例如:

$ setsid ssh user@skinner

                                       问桂的SS

一个办法

如果您想使其成为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-keyringhttps://www.archlinux.org/packages/extra/i686/gnome-keyring)可以帮助您解决您的问题。

无论如何,如果您不介意使用 seahorse,您还可以安装软件包seahorsegnome-keyring(或您的发行版的等效软件包)。如果您不使用 Gnome,则可能需要执行其他步骤:https://wiki.archlinux.org/index.php/GNOME_Keyring

相关内容