◆ ssh-agent があれば鍵を事前にロードしておいて毎回パスワード入力しなくていい
◆ ssh-ident は内部で ssh-agent 管理していて ssh-agent の面倒な部分が楽になる

ssh でログインするときに毎回パスワードいれるのって面倒ですよね
shellscript 中などでは処理ごとに毎回パスワード入れる必要があってやってられません

パスワードじゃなくて鍵認証にしてしまう方法があります
ただ 鍵にもパスワードがあるんですよね

パスワード不要の鍵ファイルにしておけばよかったものを パスワードありの鍵にしていろいろなところに登録済みなので変えるのも面倒です

ssh-agent

そういうときに使われるのが ssh-agent です
agent を起動しておいて ssh-add コマンドで事前に鍵を登録しておきます
登録するときにパスワードを入力すれば ssh コマンドを使うときはパスワードなしで使えます

鍵は複数登録しておけるので 持ってる鍵全部登録しておけば自動で適切な鍵ファイルを使ってくれます
内部ではたぶん総当たりでやってるのかな?
一度ログインできたらホストに対する鍵はどれって情報を保存してたりしそうですが そのへんまでは触れません

簡単な仕組み

ssh-agent コマンドを実行すると agent が起動されて シェルのコマンドが出力されます
こういうのです

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

agent は動いていても環境変数の情報を元に接続して使うようで 単に ssh-agent を実行した後に ssh や ssh-add をしても効果がないです
出力されたコマンドを実行して環境変数を設定する必要があります
なのでよく eval する書き方が使われます

eval `ssh-agent`

その場で eval してしまわず ファイルに保存しておけば 一旦ログアウトしても ssh-agent が動いてる限りはその agent に接続できるので登録した鍵を使えます
msys2 でウィンドウを複数開いて ウィンドウごとに別のサーバに接続することがよくあるのですが ファイルを保存しておけば 全部のウィンドウで同じ agent を使い回せます
ウィンドウ開くごとに毎回パスワード入力は面倒ですからね

たまに

ssh-agent bash

という書き方も見かけますが こっちだと環境変数が設定された bash が新たに起動します
シェルの中でシェルを動かすのってあんまり好きじゃないのと 直前の履歴が引き継げなかったり不便もあるのでこっちは特に使ってません

もっと楽に使いたい

こういう特殊なことしなくても自動で動いてる agent を使ってほしいのですが 複数ユーザがいたり ユーザでも用途ごとに agent を分けたいとかあるのでこういう仕様になってるのかと思います
そうは言っても不便なんですよね

もっと楽に使えるツールがないか探すと keychainssh-ident というツールがあるようです
https://askubuntu.com/questions/857935/keychain-vs-ssh-ident

比較がいまいちわかりません

それぞれ調べてみると keychain は shellscript で ssh-idnet は python のツールのようです
keychain の方は wiki もあって情報が多そうですが いまのところ fish は対応してないようです
fish が入ってなくて bash を使うこともありますが 比べると bash は結構不便なので fish でもいい ssh-ident を使うことにしました

ssh-ident の方は 情報が readme くらいで それもソースコード中のコメントを取り出したようなものです
情報が少なくいろいろ苦戦しましたが それは別記事にします
簡単に使うなら ssh-ident ファイルをダウンロードして ssh という名前で alias をつけて実行すればいいです

ただし ssh-ident ファイルのあるフォルダでやるとダメみたいで ホームディレクトリに ssh-ident を置いて ホームディレクトリで ssh コマンドを実行すると動かないです
実際に中で実行するコマンドが ssh だったり scp だったりするのでそれを自動検出する方法が実行された名前で探すというものなので ssh-ident という名前だとダメで ssh という名前で呼び出す必要があります
ssh で見つかったものが ssh-ident だとループになるのでエラーになります