用于 ssh-agent 的 systemd 服务,为每次登录加载身份文件

用于 ssh-agent 的 systemd 服务,为每次登录加载身份文件

我正在尝试设置一种自动方式来在登录时加载我的 ssh 密钥。

我有以下配置:

❯ cat .ssh/config
Host github
    HostName ssh.github.com
    User git
    Port 443
    AddKeysToAgent yes
    IdentitiesOnly yes
    IdentityFile ~/.ssh/github

当我尝试通过 登录时,我得到ssh -T [email protected][email protected]: Permission denied (publickey).

为了解决这个问题,我执行以下命令:

eval "$(ssh-agent -s)" &> /dev/null; find ~/.ssh/ -type f -exec grep -l "PRIVATE" {} \; | xargs ssh-add &> /dev/null

之后,我再次运行,现在它可以工作了:ssh -T [email protected]Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

如果我把它放在我的文件中,我每次登录.zshrc都会得到一个新的 PID 。ssh-agent为了避免这种情况,我想将上面的命令转换为 systemd 服务。

我已经表演过此处概述的步骤因为我在 Fedora 39 的 WSL 下运行它。我还将以下变量添加到我的.zshrc

export XDG_RUNTIME_DIR=/run/user/$(id -u)
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

ssh-agent.service文件如下所示:

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
Environment=DISPLAY=:0 # DISPLAY required for ssh-askpass to work
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/sh -c 'find ~/.ssh/ -type f -exec grep -l "PRIVATE" {} \; | xargs ssh-add &> /dev/null'
ExecStop=kill -15 $MAINPID

[Install]
WantedBy=default.target

执行 a systemctl --user daemon-reload,然后执行 asystemctl --user enable ssh-agent && systemctl --user start ssh-agent成功启动服务,但是,当尝试执行此操作时,我会收到相同的错误消息,直到我运行该消息才能正常工作。重新启动和/或新 shell 登录后问题仍然存在。ssh -T [email protected]find ~/.ssh/ -type f -exec grep -l "PRIVATE" {} \; | xargs ssh-add &> /dev/null

AddKeysToAgent配置后不会自动添加密钥,这就是为什么我需要通过命令手动添加它们。

我在这个设置中缺少什么吗?请帮忙。

答案1

重新启动整个机器似乎已经修复了它。当使用其他 shell(如 FISH)时,这也有效,但这需要在 shell 配置中声明:

❯ bat --style=plain ~/.config/fish/conf.d/_ssh_agent_init.fish
if status is-login
  set -gx XDG_RUNTIME_DIR "/run/user/$(id -u)"
  set -gx SSH_AUTH_SOCK "$XDG_RUNTIME_DIR/ssh-agent.socket"
end

基本上,无论使用哪个 shell,都需要声明这些环境变量才能工作,并且需要初始化一个新的 shell(采购并不总是有效):

export XDG_RUNTIME_DIR=/run/user/$(id -u)
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

在 shell 的 RC 文件中设置这些后,您需要重新启动 shell: exec bashexec zshexec fish,具体取决于 shell。

相关内容