◆ ssh-ident では秘密鍵と公開鍵のペアが .ssh フォルダに配置されてる必要あり
◆ 公開鍵は登録済み判定の fingerprint 取得のために使われる
◆ 秘密鍵だけで無理やりやるようにした

鍵がロードされてない

ssh-agent が面倒なので楽に使えるツールの ssh-ident を使ってみました
ssh-agent を中で使うのでパスワードは最初の 1 回だけでいいはずなのに なぜか毎回パスワードが要求されます

プロセス一覧を見るとちゃんと ssh-agent は起動されています
ssh-agent 単体で使って ssh-add した場合は ちゃんとパスワードなしでログインできます

ssh-ident が ssh-agent を実行したときの環境変数をセットするコマンドは

.ssh/agents/agent-{USER}-{HOST}

に保存されます
USER と HOST は実行ユーザとホスト名なので環境によって違います

このファイルをロードします

source .ssh/agents/agent-{USER}-{HOST}

この状態で

ssh-add -l 

して登録済みの鍵を表示すると 鍵なしになってました

ssh-add .ssh/id_rsa

して鍵を登録してから ssh-ident を使うとパスワードいらずでログインできました
ログを見てみても最初から All keys already loaded が表示されて Loading keys は出ていません

鍵の読み込みがうまくできてないようです

秘密鍵と公開鍵の両方が必要

FindUnloadedKeys 関数を見てみると

if "pub" not in config:
continue
if "priv" not in config:
continue

というコードがあって pub と priv の両方が必要がないとスキップされています
私の場合は msys2 で使っていて 鍵ファイルは Windows のフォルダで管理していて msys2 のホームフォルダには秘密鍵のみ配置しています
本来必要ないのにコピーして同じものがあちこちにあるのは管理が煩雑になって嫌ですし このツールのためだけにわざわざ公開鍵を持ってくる気もしません
ssh や ssh-agent 自体が秘密鍵だけでいいのだからなくてもいけるはず

なぜ公開鍵が必要なの

なぜ必要なのか調べてみると 毎回鍵をロードする処理があって ロード済みのものはスキップするために使ってました

鍵の中身や パスでチェックすればいいじゃん と思ったのですが ssh-ident プログラム自体は毎回 1 から再実行されるものです
変数に入れても意味はありません
ファイルに保存しておくにしても ssh-agent と同じライフサイクルにしないといけません
ssh-agent を再起動したときに登録済み鍵一覧のファイルもリセットしないと整合性が取れなくなります
ssh-agent が起動しているか確認して 必要なら起動する処理があるので そこでファイル更新すればよさそうですが このプログラム外でユーザが agent を終了したりもできるので確実性のある 実際に ssh-agent から取得できる登録済みの鍵情報を使ってるようです

ssh-agent では ssh-add -l コマンドなどを使って登録済みの鍵の fingerprint や公開鍵を取得できます
fingerprint は ssh-keygen -l で取得できますがそれには公開鍵が必要です
秘密鍵では *** is not a key file. とエラーになります
つまり 登録済みの確認には公開鍵が必要ということです

一応秘密鍵から公開鍵を作れますがそれにはパスワードが必要です
毎回パスワード入力が必要ならこのツールの必要性なくなります

それでも秘密鍵だけにする

とは言っても 公開鍵を置くのが気に入らなかったので 事前にロードしておく方法にしました
ssh-ident はすでに agent があれば新規に作らず .ssh/agents/agent-{USER}-{HOST} にある下のようなコマンドのファイルをロードします

SSH_AUTH_SOCK=/tmp/ssh-zmGgCFKiEvjs/agent.20120; export SSH_AUTH_SOCK;
SSH_AGENT_PID=24934; export SSH_AGENT_PID;
echo Agent pid 24934;

それを利用して ssh-ident が agent を起動するのではなく事前に agent 起動と鍵をロードしておいて ssh-ident ではすでにある agent を使って ssh コマンドを実行するという部分だけを行うようにします

事前処理はこういうものです

#!/bin/sh

host=`hostname`
agentfile="$HOME/.ssh/agents/agent-$USER-$host"
keys="$HOME/.ssh/id_rsa"

if [ -f $agentfile ]; then
pid=`sh -c ". $agentfile > /dev/null; echo \\$SSH_AGENT_PID"`
if pgrep ssh-agent | grep -x $pid > /dev/null; then
echo "ssh-agent is already running"
exit
fi
fi

mkdir -p `dirname $agentfile`
ssh-agent > $agentfile
sh -c ". $agentfile; ssh-add $keys"

echo "ssh-ident is ready"

これを pressh という名前にして

alias ssh="/opt/ssh-ident/pressh && /opt/ssh-ident/ssh-ident"

と alias を設定します
/opt/ssh-ident のところは適当に置き換えてください

pressh では ssh-agent が起動してないなら起動して鍵をロードします
2 回目以降の ssh-agent が起動中なら何もしません

keys のところにデフォルトで .ssh/id_rsa だけを設定していますが ここに複数の秘密鍵のパスを書くと全部ロードされます

プロセスがあるか探すために pgrep コマンドを使ってますが msys2 だとデフォルトで入ってなかったので

pacman -S procps

を使ってインストール必要でした

まぁこんな変なことせずに公開鍵もペアで .ssh フォルダの中に配置したほうがいいでしょう