![切换到 openssh-agent](https://linux22.com/image/1058128/%E5%88%87%E6%8D%A2%E5%88%B0%20openssh-agent.png)
我的问题是在全新安装 Ubuntu 16.10ssh-agent
后立即启动并运行。gnome-keyring
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.10
Release: 16.10
Codename: yakkety
我已经禁用 Gnome Keyring 的 SSH 组件(X-GNOME-Autostart-enabled=false
在gnome-keyring-ssh.desktop
)。
Ubuntu 16.10 会自动启动一个实例ssh-agent
,并应传播环境变量,但部分未能成功。如果通过 Unity Launcher 或 Nautilus 启动终端,则$SSH_AUTH_SOCK
设置,但如果通过键盘快捷键(默认为ctrl
+ alt
+ t
)启动终端,则变量为空。
缩短的 pstree:
systemd─┬─accounts-daemon─┬─{gdbus}
│ └─{gmain}
├─acpid
├─agetty
├─avahi-daemon───avahi-daemon
├─cgmanager
├─colord─┬─{gdbus}
│ └─{gmain}
├─cron
├─dbus-daemon
├─gnome-keyring-d─┬─{gdbus}
│ ├─{gmain}
│ └─{timer}
├─lightdm─┬─Xorg
│ ├─lightdm─┬─upstart─┬─hud-service─┬─{QDBusConnection}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-appli─┬─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-bluet─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-datet─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─4*[{indicator-datet}]
│ │ │ │ └─{pool}
│ │ │ ├─indicator-keybo─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-messa─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-power─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-print─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-sessi─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─indicator-sound─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─sh───url-dispatcher─┬─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─3*[{url-dispatcher}]
│ │ │ ├─2*[sleep]
│ │ │ ├─2*[upstart-dbus-br]
│ │ │ ├─upstart-file-br
│ │ │ ├─upstart-udev-br
│ │ │ ├─window-stack-br───{QDBusConnection}
│ │ │ └─xbrlapi
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─{gdbus}
│ └─{gmain}
├─polkitd─┬─{gdbus}
│ └─{gmain}
├─rsyslogd─┬─{in:imklog}
│ ├─{in:imuxsock}
│ └─{rs:main Q:Reg}
├─rtkit-daemon───2*[{rtkit-daemon}]
├─snapd───6*[{snapd}]
├─systemd─┬─(sd-pam)
│ ├─at-spi-bus-laun─┬─dbus-daemon
│ │ ├─{dconf worker}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─at-spi2-registr─┬─{gdbus}
│ │ └─{gmain}
│ ├─bamfdaemon─┬─{gdbus}
│ │ └─{gmain}
│ ├─compiz─┬─{dconf worker}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─dbus-daemon
│ ├─dconf-service─┬─{gdbus}
│ │ └─{gmain}
│ ├─gconfd-2
│ ├─gnome-session-b─┬─deja-dup-monito─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─gnome-software─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─nm-applet─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─polkit-gnome-au─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─unity-fallback-─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─update-notifier─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─zeitgeist-datah─┬─{gdbus}
│ │ │ ├─{gmain}
│ │ │ └─4*[{pool}]
│ │ ├─{dconf worker}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─gnome-terminal-─┬─fish───pstree
│ │ ├─{dconf worker}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─gpg-agent
│ ├─ibus-daemon─┬─ibus-dconf─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─ibus-engine-sim─┬─{gdbus}
│ │ │ └─{gmain}
│ │ ├─ibus-ui-gtk3─┬─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ └─{gmain}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─ibus-x11─┬─{gdbus}
│ │ └─{gmain}
│ ├─nautilus─┬─{dconf worker}
│ │ ├─{gdbus}
│ │ └─{gmain}
│ └─ssh-agent
├─systemd-journal
├─systemd-logind
├─systemd-resolve
├─systemd-timesyn───{sd-resolve}
└─systemd-udevd
ssh-agent服务的状态:
$ systemctl --user status ssh-agent 22:03:56
● ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static; vendor preset: enabled)
Active: active (running) since Sun 2016-11-20 21:59:06 CET; 7min ago
Main PID: 5513 (ssh-agent)
CGroup: /user.slice/user-1000.slice/[email protected]/ssh-agent.service
└─5513 ssh-agent -D -a /run/user/1000/openssh_agent
Nov 20 21:59:06 Cerberus systemd[4879]: Started OpenSSH Agent.
Nov 20 21:59:06 Cerberus agent-launch[5513]: dbus-update-activation-environment: setting SSH_AUTH_SOCK=/run/user/1000/openssh_agent
Nov 20 21:59:06 Cerberus agent-launch[5513]: dbus-update-activation-environment: setting SSH_AGENT_LAUNCHER=openssh
Nov 20 21:59:06 Cerberus agent-launch[5513]: SSH_AUTH_SOCK=/run/user/1000/openssh_agent; export SSH_AUTH_SOCK;
Nov 20 21:59:06 Cerberus agent-launch[5513]: echo Agent pid 5513;
环境gnome-terminal-server
知道正确的SSH_AUTH_SOCK
$ ps aux | grep /usr/lib/gnome-terminal/gnome-terminal-server
max 6408 0.3 0.1 740696 32148 ? Ssl 22:00 0:01 /usr/lib/gnome-terminal/gnome-terminal-server
max 13129 0.0 0.0 21428 1844 pts/5 S+ 22:09 0:00 grep --color=auto /usr/lib/gnome-terminal/gnome-terminal-server
$ xargs -n 1 -0 < /proc/6408/environ | grep SSH_AUTH_SOCK 22:09:35
SSH_AUTH_SOCK=/run/user/1000/openssh_agent
我尝试过的每种启动终端的方法都导致它们成为gnome-terminal-server
具有正确环境设置的终端的子终端。
有什么方法可以解决这个问题,或者我应该提交一个错误报告吗?
答案1
我让它工作了,问题似乎是一个竞争条件。
首先,我运行
systemctl --user mask gnome-keyring-ssh
并保留更改gnome-keyring-ssh.desktop
以完全禁用 Gnome Keyring 的 SSH 服务。仅仅屏蔽服务是不够的。
systemctl --user edit ssh-agent
其次,我创建了一个包含以下设置的服务文件覆盖 :
[Service]
Type=forking
最后我编辑/usr/lib/openssh/agent-launch
并替换exec ssh-agent -D -a $S
为ssh-agent -a $S
。
我尝试将服务类型设置为notify
,NotifyAccess
并在执行之前all
运行,但由于某种原因没有收到通知并遇到了超时。systemd-notify --ready
ssh-agent
systemd
ssh-agent.service