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 zshexec fish

おすすめ記事