在 WSL2 上运行 Fedora 时,我发现套接字激活ssh-agent
不能正常工作:触发实际服务启动的第一个请求失败。这可能是git fetch
或git pull
请求,也可能是ssh-add
调用。这显示为客户端调用的长时间超时,而不是立即失败。
由于 systemd 配置包含和ssh-agent.socket
, ssh-agent.service
因此尝试直接禁用ssh-agent.socket
和启用不起作用ssh-agent.service
,因为它只是重新打开套接字激活,而不是将服务配置为自动启动:
~$ systemctl --user is-enabled ssh-agent.socket
enabled
~$ systemctl --user is-enabled ssh-agent.service
indirect
~$ systemctl --user enable ssh-agent.service
~$ systemctl --user is-enabled ssh-agent.service
indirect
~$ systemctl --user disable ssh-agent.socket
Removed "/home/acoghlan/.config/systemd/user/sockets.target.wants/ssh-agent.socket".
~$ systemctl --user enable ssh-agent.service
Created symlink /home/acoghlan/.config/systemd/user/sockets.target.wants/ssh-agent.socket → /usr/lib/systemd/user/ssh-agent.socket.
OpenSSH ssh-agent 不支持套接字激活——它不知道必须从父级接收套接字交接,而是始终建立自己的套接字。
因此,您的第一个请求会被困在 systemd 建立的套接字队列中(ssh-agent 刚刚取消链接并用自己的套接字替换),而第二个请求现在会通过恰好具有相同名称的不同套接字。
这不是时间问题;套接字激活本质上是“即时”的(当与知道如何接受它的程序一起使用时),特别是因为初始请求在套接字队列中停留的时间与程序在拾取之前需要初始化的时间一样长——这实际上是当程序不知道如何接受它时导致此问题的原因。(所以它与“需要时间来整理自己”完全相反。)
我不想调整 systemd 配置(这不仅可能最终成为特定于发行版的并且可能会随着时间的推移而改变,而且还会影响我没有启动交互式 shell 的情况),而是想要添加一些可以
.bash_profile
确保实际ssh-agent
服务始终在交互式会话中运行,而不仅仅是监听套接字。ssh-add -l
(列出已加载的密钥指纹)似乎是一个很好的触发命令(因为ssh-add
如果我打算使用 SSH,它会提醒我运行),用于timeout
检测故障(因为ssh-add -l
如果代理正常工作,通常应该是接近即时的)。.bash_profile
这给出了以下解决方法(我将其添加到我的主目录的末尾):(
ssh-add -l
如果没有加载任何密钥,则报告退出代码 1,但如果连接尝试失败,则报告退出代码 2。由于timeout
失败代码均为 124 或更高,因此[ $? -gt 1 ]
在尝试激活套接字时检查会检测到任何失败。仅检查timeout
错误代码通常仍会在实例重新启动后立即失败,并显示消息“连接到代理时出错:没有此文件或目录”)WSL2 实例重启后新终端会话的示例输出: