로그인 시 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