SSH-agent를 위한 systemd 서비스, 각 로그인에 대한 ID 파일 로드

SSH-agent를 위한 systemd 서비스, 각 로그인에 대한 ID 파일 로드

로그인 시 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한 다음 a를 systemctl --user enable ssh-agent && systemctl --user start ssh-agent성공적으로 시작하면 서비스가 시작됩니다. 그러나 이 작업을 수행하려고 하면 동일한 오류 메시지가 나타나고 이를 실행할 때까지 작동하지 않습니다. 재부팅 및/또는 새 셸 로그인 후에도 문제가 지속됩니다.ssh -T [email protected]find ~/.ssh/ -type f -exec grep -l "PRIVATE" {} \; | xargs ssh-add &> /dev/null

키는 구성 후에 만 자동으로 추가되지 않으므로 AddKeysToAgent명령을 통해 수동으로 추가해야 합니다.

이 설정에서 뭔가 빠졌나요? 도와주세요.

답변1

전체 시스템을 재부팅하면 문제가 해결된 것 같습니다. 이는 다른 쉘(예: FISH)을 사용할 때도 작동하지만 쉘 구성에서 선언해야 합니다.

❯ 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

기본적으로 어떤 셸을 사용하든 관계없이 이러한 환경 변수가 작동하도록 선언해야 하며 새 셸을 초기화해야 합니다(소싱이 항상 작동하는 것은 아닙니다).

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

셸의 RC 파일에서 이를 설정한 후 셸을 다시 시작해야 합니다. 셸에 따라 exec bash또는 exec zsh또는 .exec fish

관련 정보