🔐

Systemd user serviceで起動したssh-agentをfish shellで使う

2023/12/10に公開

はじめに

地味にハマったのでメモしておく。
環境は、Arch Linux (x86-64) 。他のディストリビューションでも同様だと思われる。

ssh-agent as systemd user service

.config/systemd/user/ssh-agent.service として以下の内容のファイルを作る

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

systemctl --user enable --now ssh-agent.service で有効化しておく。
ps aux | grep ssh-agent で起動しているかチェック。

fish側の設定

ここが一番メモしたかったところ。
ssh-agentを使うためには環境変数 SSH_AUTH_SOCK が export されている必要がある。
.config/fish/conf.d/fish-ssh-agent.fish に以下のように書いた

set -gx SSH_AUTH_SOCK "$XDG_RUNTIME_DIR/ssh-agent.socket"

テスト

ssh-add を実行する。実行しているユーザーがSSH鍵を持っていてパスワードがかかっていれば
いつもの、SSH鍵のパスワードを尋ねるプロンプトが出る。

トラブルシューティング

ssh-add がエラー Could not open a connection to your authentication agent. を出力する。

  • ls -l $SSH_AUTH_SOCK したときソケットが表示されますか?
ls -l $SSH_AUTH_SOCK
srw------- 1 yakumo yakumo 0 12月 10 11:16 /run/user/1000/ssh-agent.socket=

されないなら、多分ssh-agentが起動していません。

  • printenv | grep SSH_AUTH_SOCK で SSH_AUTH_SOCK 環境変数が表示されますか?

されない場合、 set に x が足りていません。 set -g では駄目で、 x がある必要があります。
printenvでは、exportされた変数しか表示しないので、ここに表示されないということは、ssh-agentからも変数が見えていません。

Discussion