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


41

如何强制SSH使用图形提示(例如GTK)而不是使用终端的标准提示来请求密码?

我尝试设置,SSH_ASKPASS=/usr/bin/ssh-askpass但似乎没有效果。

问题是openssh文档说的事实

如果ssh 没有与之关联的终端,但是设置了DISPLAY和SSH_ASKPASS,它将执行SSH_ASKPASS指定的程序并打开X11窗口以读取密码。

在命令行启动,在我的情况下的结果的SSH git push具有与其相关联的终端,所以SSH_ASKPASS逻辑似乎被忽略。

请注意,我不是指ssh-add,而是指对存在密钥对但受密码保护的主机的通用ssh调用。

Answers:


32

#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“没有关联的终端” AND DISPLAYSSH_ASKPASS已设置。注意这是关键。因此,要ssh开始使用,SSH_ASKPASS我们需要ssh不连接任何终端(也称为STDINSTDOUT)。

一种使用命令的方式setsid。不要难过 我也从未听说过此工具。从手册页:

setsid-在新会话中运行程序

因此,如果我们ssh以“程序”身份运行,则setsid可以ssh从满足我们ssh手册页中提到的条件的终端分离。其他标准设置如下:

$ 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

参考文献


ssh-askpass gnome已安装,如果手动启动,则可以正常工作。
gioele

@gioele-查看更新,我想我已经解决了。
slm

该解决方案的问题在于,它要求我修改每个git或rsync命令以使用setsid sshplain instad ssh
gioele

@gioele-您要求一种“强制”密码GUI的方法,它提供了这一点。您可以ssh使用别名替换诸如命令之类的setsid ssh方法。还有其他方法。限制因素是openssh不需要附加TTY即可激活ASK_SSHPASS。
slm

我没有缺少该程序包,因此无法使用它setsid,然后ssh从终端进行操作。那根本不是一个有效的答案!另外,它可以在旧版本的Ubuntu中运行,所以我不太确定我为什么会突然停止工作!
亚历克西斯·威尔克

8

无法在当前的OpenSSH中完成:从2013-07开始,OpenSSH Bugzilla中存在一个要求此功能的问题:Generalize SSH_ASKPASS


这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
cuonglm

8
@cuonglm“这不可能”是一个答案。这可能是错误的或令人误解的(我不是说是),但这仍然是答案。
terdon

2

有一种方法可以通过单个命令关闭终端,即使用文件重定向:

ssh-add > /dev/null < /dev/null 2>&1

这将ssh-add在终端关闭的情况下运行命令。除了它的复杂性之外,还算不错。但是,既然您知道正确的命令,只需将其命名为别名并将其附加到~/.bash_aliases

alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"

而你应该被设置。ssh-add现在,只需键入将调用别名,该别名将在所有重定向到位的情况下调用真实命令。

ssh-add现在正确地问你一个对话框,密码......只要你有这些软件包安装(在Ubuntu或衍生物,它们可能有其他地方的名称)中的一种:

  • ssh-askpass
  • ssh-askpass-fullscreen
  • ssh-askpass-gnome
  • ksshaskpath
  • kwalletcli
  • lxqt-openssh-askpass
  • razorqt-openssh-askpasss

现在,这些东西是什么意思?

2>&1装置重定向文件描述符#2(标准误差),以相同的地方文件描述符#1(标准输出)被引导到。

> /dev/null意味着将标准输出重定向到/dev/null,这是一个特殊文件,该文件将丢弃所有写入其中的数据。

< /dev/null装置重定向标准输入/dev/null(同上)。

作为附带说明,还有一个与主题无关的相关说明,如果您想在bash中对服务进行编程,则必须记住实际上是什么服务,该进程在后台具有标准输入,输出和错误关闭功能:

service > /dev/null < /dev/null 2>&1 &

请注意,唯一的区别是在末尾添加了&(加上我更改ssh-add了理论上的命令的事实service。这些命令将正确地在后台放置服务。


感谢您对维克多的详细回答。但是,它不符合我的要求。正如我在问题末尾所写的那样:“请注意,我不是在指ssh-add,而是指对存在密钥对但受密码保护的主机的通用ssh调用。”
gioele

我懂了。好吧,ssh功能完全相同,我以前给出的答案仍然适用。只需将的所有出现替换为ssh-addssh您就会被设置。
维克多

您只忘记了一个很小的细节:如果我关闭ssh的stdin / stdout,我如何通过ssh发出命令?;)
gioele,2017年

ssh-add对我有用-我什至无需重定向stdout / stderr即可获得所需的行为,即弹出ssh-askpass程序。(那就ssh-add < /dev/null足够了。)
Ben Stern

0

seahorse-ssh-askpassgnome-keyring在ArchLinux上安装软件包的情况下安装seahorse(提供)时遇到了相同的问题。

查看此软件包的内容gnome-keyringhttps://www.archlinux.org/packages/extra/i686/gnome-keyring)可以帮助您解决问题。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.