DELOGs
[小技:Mac限定]SSH接続時に秘密鍵のパスフレーズ入力が不要に?!

小技:Mac限定
SSH接続時に秘密鍵のパスフレーズ入力が不要に?!

SSH接続する際に、秘密鍵のパスフレーズを毎回入力するのは面倒という方へ、その手間を省略する方法を紹介

初回公開日

最終更新日

Macの「ターミナル」を愛用していて、SSH接続するたびにパスフレーズを入力するが手間だなぁと感じている方へ向けた解消方法です。 私はつい最近知りました。もっと早く知りたかった。。というわけで、私と同じ初心者の方へ共有しておきたい。

1.結論

~/.ssh/id_rsaが秘密鍵だとします。下記のようにすればOKです。

~/.ssh/config に設定を追加

zsh : config
1Host 192.168.0.100 2 AddKeysToAgent yes 3 UseKeychain yes 4 IdentityFile ~/.ssh/id_rsa

鍵を追加してキーチェーンに保存

zsh
1ssh-add --apple-use-keychain ~/.ssh/id_rsa
以下、詳細を説明していきます。

2.SSHエージェントとは?

まず、この「SSHエージェント」存在を私は知らなかった。こんな便利なものがあったとは。
SSHエージェントは、秘密鍵(id_rsa など)を キャッシュ して、パスフレーズを何度も入力しなくても済むようにする仕組みです。 SSHエージェントを使うと、最初にパスフレーズを入力すれば、その後は 自動的に鍵を使って接続できる ようになります。

SSHエージェントが起動しているかを確認

zsh
1ps aux | grep ssh
zsh
1・・・ /usr/bin/ssh-agent -l
ssh-agent -lがいれば起動しています。

SSHエージェントが起動いなければ起動

zsh
1eval "$(ssh-agent -s)"

SSHエージェントへの一時的な秘密鍵登録

zsh
1ssh-add ~/.ssh/id_rsa
パスフレーズを聞かれますので、入力すれば登録完了です。パスフレーズ入力時は、私の環境ではコピペではできませんでした。一文字ずつ入力しました。

ssh-add -l で登録された鍵を確認

zsh
1ssh-add -l
上記のコマンドでSSHエージェントに登録されている秘密鍵リストを参照することができます。
ただ、この方法では、Macを再起動するとリセットされてしまいます。

3.再起動後も自動で鍵を登録する

Macを再起動しても、 SSHエージェントに秘密鍵を自動で登録するようにするには下記の手順を踏みます。

~/.ssh/config に設定を追加

zsh : config
1Host 192.168.0.100 2 AddKeysToAgent yes 3 UseKeychain yes 4 IdentityFile ~/.ssh/id_rsa
  • Host -> ここは接続したいサーバのIPアドレスやドメインを指定
  • AddKeysToAgent yes -> SSHエージェントに鍵を追加
  • UseKeychain yes -> Macのキーチェーンにパスフレーズを保存(Mac限定)
  • IdentityFile ~/.ssh/id_rsa -> 使用する秘密鍵を指定

鍵を追加してキーチェーンに保存

zsh
1ssh-add --apple-use-keychain ~/.ssh/id_rsa
上記のコマンドを実行すると、パスフレーズを入力します。パスフレーズ入力は、私の環境ではコピペではできませんでした。一文字ずつ入力しました。 Identity added: ・・・というメッセージが表示されて、登録が完了します。

ssh-add -l で登録された鍵を確認

zsh
1ssh-add -l
キーチェーンに登録されていることがこれでわかります。キーチェーンアプリには表示されないので、上記のコマンドで確認してください。
そうすると下記のように秘密鍵の指定自体を省略してSSH接続できます。
zsh
1ssh -p xxxx user@192.168.0.100

4.~/.ssh/configでSSH接続をさらに使いやすく

SSH接続が簡単に

ポートやユーザ名なども~/.ssh/configに設定しておくとさらに便利です。
zsh : config
1Host my-web-server 2 HostName 192.168.1.100 3 Port 2222 4 User user 5 AddKeysToAgent yes 6 UseKeychain yes 7 IdentityFile ~/.ssh/id_rsa
上記のようすると下記のようにサーバ名だけでSSH接続できます。
zsh
1ssh my-web-server

scp や rsync でも使える

zsh
1scp myfile.txt my-web-server:~/backup/ 2rsync -avz my-web-server:/var/www/ ~/local_backup/
こんな感じで利用可能になります。

SSHトンネルでDB接続も簡単に

もしデータベースのローカルIPが192.168.1.300の場合なら、通常ですと
zsh
1ssh -L 5433:192.168.1.300:5432 -N -f -i ~/.ssh/your_private_key -p 2222 user@192.168.1.100
とか長いコマンドが必要で忘れやすい。
zsh : config
1Host my-db-server 2 HostName 192.168.1.100 3 Port 2222 4 User user 5 AddKeysToAgent yes 6 UseKeychain yes 7 IdentityFile ~/.ssh/id_rsa 8 LocalForward 5433 192.168.1.300:5432 9 ServerAliveInterval 60 10 ExitOnForwardFailure yes
としてやれば、
zsh
1ssh -N my-db-server 2 3バックグランド実行は 4ssh -N -f my-db-server
で簡単にトンネルが貼れます。
バックグラウンド実行を終了するときは、
zsh
1pkill -f "ssh my-db-server"
以上のように、かなり便利なので、~/.ssh/configとSSHエージェントを有効に活用していきたいものです。
この記事の執筆・編集担当
DE

松本 孝太郎

DELOGs編集部/中年新米プログラマー

ここ数年はReact&MUIのフロントエンドエンジニアって感じでしたが、Next.jsを学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。