我想在 xubuntu 中使用真正的 ssh-agent 而不是 gnome-keyring。我按照以下步骤操作http://dtek.net/blog/how-stop-gnome-keyring-clobbering-opensshs-ssh-agent-ubuntu-1204,但 gnome keyring 仍将自身注册为 ssh-agent。我仍然想继续使用 gnome-keyring 来处理其他密码
答案1
事实证明,如果在 xfce 中启用了 gnome 兼容性,xfce4-session 将无条件启动 gnome-keyring-daemon。这是硬编码的,目前无法配置。禁用 gnome 兼容模式会导致 keyring 在登录时不启动,如果启动它,您将需要再次提供密码。
最简单的解决方案似乎是拦截对 gnome-keyring-daemon 的调用,并插入一个脚本,将标志插入--components
到参数中,以防止 gnome keyring 取代 ssh-add。
运行以下命令来移动 gnome-keyring-daemon:
sudo mv /usr/bin/gnome-keyring-daemon /usr/bin/gnome-keyring-daemon-wrapped
使用以下命令创建一个新的 gnome-keyring-daemon
sudo nano /usr/bin/gnome-keyring-daemon
并插入以下内容:
#!/bin/sh
exec /usr/bin/gnome-keyring-daemon-wrapped --components=pkcs11,secrets,gpg "$@"
使用 使新的 gnome-keyring-daemon 可执行sudo chmod +x /usr/bin/gnome-keyring-daemon
。
现在 gnome keyring 将不再尝试替换 ssh-add。
请注意,升级系统将恢复默认的 gnome-keyring-daemon,因此升级后您可能需要再次执行上述步骤。
编辑:
在 xubuntu 14.10 中,启动方式略有不同,因为 gkd 也是从会话 upstart 启动的。可以覆盖 upstart 配置,这样它就不会启动 ssh 组件,但即使如此,当 xfce4-session 也尝试启动它时,gkd 也会启动其 ssh 组件。因此,如果您希望 xfce 也自动启动 gnome 服务,您仍然需要上述技巧。另一种方法是禁用 gnome 服务(设置 -> 会话和启动 -> 高级 -> 启动时启动 GNOME 服务),将 upstart 配置为使用标志启动 gkd --components=pkcs11,secrets,gpg
,还可以选择配置您想要手动启动的 gnome 服务。
(除了上面提到的两个启动 gkd 的地方之外,gk-daemon 也在此之前从 lightdm/PAM 启动,以接收用户的登录密码。但那次启动并没有完全配置 gkd,它仍然希望通过第二次尝试启动来完全配置,所以那次启动尝试与当前问题无关。)
答案2
这是一个老话题,但我在 Xubuntu 14.04 上解决这个问题的方法很简单,只需gnome-keyring-daemon
在 Session 和 Startup 上重新生成即可。您需要做的只是运行以下命令:
$ gnome-keyring-daemon --replace --daemonize --components=pkcs11,secrets,gpg
我们从 Gnome 密钥环的组件中删除了“ssh”。
- 前往菜单 > 设置 > 会话和启动
- 单击“应用程序自动启动”选项卡
- 点击添加按钮
- 将出现新的应用程序窗口,您可以按照以下示例进行填写。
- 姓名: SSH 钥匙圈移除器
- 描述:从 GNOME 密钥环中删除 SSH
- 命令:
gnome-keyring-daemon --replace --daemonize --components=pkcs11,secrets,gpg
- 单击“确定”
尝试注销 XFCE 会话并重新登录。要确保 Gnome 密钥环不再管理 ssh,只需运行。
$ ssh-add -l
Could not open a connection to your authentication agent.
如果您收到该消息,则意味着 Gnome 密钥环无法管理您的 SSH,并且您可以自由使用原始的 OpenSSH ssh-agent 实现。
答案3
为了基于@JanKanis 的回答,我将其追溯到 xfce4-session 是启动 gnome-keyring-daemon --start 命令的罪魁祸首。
当以这种方式运行时,gnome-keyring-daemon 不会检查是否已设置 SSH_AUTH_SOCK,这是一个“功能”,因为您可以让 ssh-agent 和 gnome-keyring-daemon 同时提供套接字。
首先要说的是:
添加~/.config/upstart/gnome-keyring.conf
:
description "GNOME Keyring agents"
author "Dimitri John Ledkov <[email protected]>"
start on (starting xsession-init or starting ssh-agent or starting gpg-agent) and started dbus
task
script
# Stop because I say so
stop; exit 0
eval "$(gnome-keyring-daemon --start)" >/dev/null
initctl set-env --global SSH_AUTH_SOCK=$SSH_AUTH_SOCK
initctl set-env --global GPG_AGENT_INFO=$GPG_AGENT_INFO
end script
现在用包装器替换 gnome-keyring-daemon(我将原来的移动到 /usr/libexec/):
#!/bin/sh
gkd=/usr/libexec/gnome-keyring-daemon
debug=1
log=${XDG_CACHE_HOME:-"${HOME}/.cache"}/gkd.log
if [ ${debug} -gt 0 ]
then
echo "================" >> ${log}
echo "Invoked as $0 $@" >> ${log}
echo "================" >> ${log}
/usr/bin/pstree -lag >> ${log}
fi
case "$@" in
*--start*)
$gkd --components=pkcs11,secrets,gpg "$@"
;;
*)
$gkd "$@"
;;
esac
if [ ${debug} -gt 0 ]
then
/usr/bin/pstree -lag >> ${log}
fi
调试代码可以帮助您找出它停止工作的原因。由于这些程序都没有合理的配置方法,因此根本无法绕过黑客命令。在这种情况下,我找不到任何记录在案的配置方法,以使 xfce4-session 不调用 gnome-keyring-daemon --start,而且没有其他副作用。它们都对正在安装的东西做出假设,因此继续读取用户的想法。
答案4
这是 JanKanis 发布的脚本的侵入性较低的版本。它接受传递给它的任何组件,但会删除 SSH 组件。
#!/bin/bash
ARGS="$@"
COMPONENTS=""
if [[ $ARGS =~ \-\-components= ]]; then
component_match_expression='(\-\-components=([0-9a-z,]+))'
COMPONENTS=$(echo $ARGS | grep -oP "$component_match_expression")
ARGS=$(echo $ARGS | sed -E "s/$component_match_expression//")
COMPONENTS="--components=$(echo $COMPONENTS | grep -oP '(?<=\-\-components=)([0-9a-z,]+)' | sed -e 's/ssh//' -e 's/,,/,/')"
if [ "$COMPONENTS" != "--components=" ]; then
ARGS="$ARGS $COMPONENTS"
else
exit 0
fi
fi
/usr/bin/gnome-keyring-daemon-wrapped $ARGS