我尝试在 Ubuntu 24.04 上使用 openssh ssh 代理 systemd 用户服务。
从 Ubuntu 16.10 开始,openssh-client
软件包包含一个ssh-agent.service
用户服务文件:
$ lsb_release -sr
No LSB modules are available.
24.04
$ dpkg -S user/ssh-agent.service
openssh-client: /usr/lib/systemd/user/ssh-agent.service
$ systemctl --user cat ssh-agent.service
# /usr/lib/systemd/user/ssh-agent.service
[Unit]
Description=OpenSSH Agent
Documentation=man:ssh-agent(1)
Before=graphical-session-pre.target
ConditionPathExists=/etc/X11/Xsession.options
Wants=dbus.socket
After=dbus.socket
[Service]
# If you need to pass extra arguments to ssh-agent, you can use "systemctl
# --user edit ssh-agent.service" to add a drop-in unit with contents along
# these lines:
# [Service]
# ExecStart=
# ExecStart=/usr/lib/openssh/agent-launch start -- -t 1200
ExecStart=/usr/lib/openssh/agent-launch start
ExecStopPost=/usr/lib/openssh/agent-launch stop
$
因此我尝试启动它但它没有活动:
$ systemctl --user start ssh-agent.service
$ systemctl --user is-active ssh-agent.service
inactive
$
经过一些研究,我设置了SSH_AUTH_SOCK
变量:
$ ssh myUbuntu-24-04-Server
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user stop ssh-agent.service
$ systemctl --user start ssh-agent.service
$ ls $SSH_AUTH_SOCK
ls: cannot access '/run/user/1000/openssh_agent': No such file or directory
$ systemctl --user is-active ssh-agent.service
inactive
$ systemctl --user status ssh-agent.service
○ ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: inactive (dead)
Docs: man:ssh-agent(1)
Feb 21 17:41:56 myUbuntu-24-04-Server systemd[118809]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:08:15 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:10:31 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:11:24 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:18:49 myUbuntu-24-04-Server systemd[119442]: Started ssh-agent.service - OpenSSH Agent.
$
但是,此服务在以前的 Ubuntu LTS(22.04)上启动正常:
$ ssh myUbuntu-22-04-Server
$ lsb_release -sr
22.04
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user start ssh-agent.service
$ systemctl --user status ssh-agent.service
● ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: active (running) since Fri 2025-02-21 18:40:55 CET; 4min 17s ago
Docs: man:ssh-agent(1)
Main PID: 23068 (ssh-agent)
Tasks: 1 (limit: 19005)
Memory: 1.1M
CPU: 6ms
CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/ssh-agent.service
└─23068 ssh-agent -D -a /run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server systemd[22133]: Started OpenSSH Agent.
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: setting SSH_AUTH_SOCK=/run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: setting SSH_AGENT_LAUNCHER=openssh
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: SSH_AUTH_SOCK=/run/user/1000/openssh_agent; export SSH_AUTH_SOCK;
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: echo Agent pid 23068;
$ ssh-add -l
The agent has no identities.
$
EDIT0:我的错,SSH_AUTH_SOCK
没有必要手动设置变量。
我在 Ubuntu 22.04 上重新测试了,无需手动设置变量就可以正常工作
SSH_AUTH_SOCK
。
但在 Ubuntu 24.04 上,我得到的结果如下:
$ ssh -X myUser@myUbuntu-24-04-Server
myUser@myUbuntu-24-04-Server:~$ echo $XDG_RUNTIME_DIR
/run/user/1000
myUser@myUbuntu-24-04-Server:~$ echo $SSH_AUTH_SOCK
myUser@myUbuntu-24-04-Server:~$ grep use-ssh-agent /etc/X11/Xsession.options
use-ssh-agent
myUser@myUbuntu-24-04-Server:~$ unset SSH_AUTH_SOCK
myUser@myUbuntu-24-04-Server:~$ systemctl --user start ssh-agent.service
myUser@myUbuntu-24-04-Server:~$ systemctl --user status ssh-agent.service
○ ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: inactive (dead)
Docs: man:ssh-agent(1)
Feb 21 17:41:56 myUbuntu-24-04-Server systemd[118809]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:08:15 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:10:31 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:11:24 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:18:49 myUbuntu-24-04-Server systemd[119442]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 17:54:39 myUbuntu-24-04-Server systemd[151016]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 17:56:01 myUbuntu-24-04-Server systemd[151016]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 18:15:38 myUbuntu-24-04-Server systemd[151355]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 18:17:06 myUbuntu-24-04-Server systemd[151355]: Started ssh-agent.service - OpenSSH Agent.
myUser@myUbuntu-24-04-Server:~$ systemctl --user is-active ssh-agent.service
inactive
myUser@myUbuntu-24-04-Server:~$ ssh-add -l
Could not open a connection to your authentication agent.
myUser@myUbuntu-24-04-Server:~$
你能帮助我吗 ?
服务未处于“活动”状态的原因如下:
use-ssh-agent
在 中定义/etc/X11/Xsession.options
。$SSH_AUTH_SOCK
在开始之前您已经定义了ssh-agent.service
。SSH_AUTH_SOCK
也在 Systemd --user 范围内定义gpg-agent-ssh.socket
。我们先看一下
ssh-agent.service
单元文件,单元启动时,/usr/lib/openssh/agent-launch
通过以下代码行调用脚本:查看该脚本,我们有以下内容:
我们可以从中得到以下几点信息:
$XDG_RUNTIME_DIR
需要定义为环境变量$SSH_AUTH_SOCK
需要未定义use-ssh-agent
需要在/etc/X11/Xsession.options
接下来,查看 的输出
systemctl --user show-environment
。这将显示你的 Systemd --user 范围环境变量:注意
SSH_AUTH_SOCK
已定义。这将阻止ssh-agent.service
启动和定义此变量。当
ssh-agent
运行时,它想要定义SSH_AUTH_SOCK
。引用ssh-agent(1) 手册页:无论如何,在 Ubuntu 24.04 的默认状态下,
SSH_AUTH_SOCK
是由名为 的套接字单元文件定义的gpg-agent-ssh.socket
,这就是为什么它在 Systemd --user 范围内可用并在 的输出中可见的原因systemctl --user show-environment
。查看gpg-agent-ssh.socket
单元文件的内容,您将看到如何SSH_AUTH_SOCK
使用 来定义ExecStartPost=
:修复
对于 Ubuntu 24.04,要启用
ssh-agent
您需要执行以下操作:定义
use-ssh-agent
于/etc/X11/Xsession.options
:防止
SSH_AUTH_SOCK
在启动时被定义在 Systemd --user 作用域中gpg-agent-ssh.socket
。这可以通过以下任一选项来实现:选项 1:
使用以下步骤创建一个
override.conf
清除ExecStartPre
、ExecStartPost
、ExecStopPre
和 的文件:ExecStopPost
运行
systemctl --user edit gpg-agent-ssh.socket
编辑并创建override.conf
文件,添加以下内容:保存并退出。
然后使用 重新加载配置更改
systemctl --user daemon-reload
。选项 2:
只需掩码即可
gpg-agent-ssh.socket
。这将阻止创建套接字。跑步
systemctl --user mask gpg-agent-ssh.socket
。然后使用 重新加载配置更改
systemctl --user daemon-reload
。在 Systemd --user 范围中取消设置
SSH_AUTH_SOCK
,该范围之前已使用单元文件定义gpg-agent-ssh.socket
。您需要在启动之前取消设置ssh-agent.service
:在文件中添加一个
[Install]
部分。这将允许您“启用”该服务并使其在启动时启动。override.conf
ssh-agent.service
然后使用 重新加载配置更改
systemctl --user daemon-reload
。启用并启动
ssh-agent.service
导出
SSH_AUTH_SOCK
以便.bashrc
此环境变量全局可用。否则ssh-add
将看不到可用的套接字,因为它看不到 Systemd --user 范围变量。将以下内容添加到底部
.bashrc
:export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/openssh_agent"
然后重新加载
.bashrc
:经过上述配置后:
你将拥有一个全局
SSH_AUTH_SOCK
变量:这将匹配 Systemd --user 范围变量:
ssh-agent
将被启用并处于活动状态(运行):输出
ssh-add -l
不会出错: