サーバーへ接続して作業するとき,SSHはほぼ必ず使う.クラウド上のLinuxサーバーへ入るときも,GitHubへSSH認証で接続するときも,基本になる考え方は同じだ.
この記事では,LinuxやmacOSのターミナルからSSHを使うための基本をまとめる.
SSHとは
SSHは,ネットワーク越しに別のコンピューターへ安全に接続するための仕組みだ.主に次の用途で使う.
- リモートサーバーへログインする
- サーバー上でコマンドを実行する
- ファイルを転送する
- GitHubなどへSSH認証で接続する
パスワードで接続する方法もあるが,サーバー運用では公開鍵認証を使うことが多い.公開鍵認証では,自分のPCに秘密鍵を置き,接続先に公開鍵を登録する.秘密鍵は外へ出さない.
基本の接続
一番基本の形は次のとおり.
1ssh ユーザー名@ホスト名
たとえば,example.com に user として接続するならこうなる.
1ssh user@example.com
IPアドレスでも接続できる.
1ssh user@203.0.113.10
接続できると,ターミナルの操作対象が手元のPCから接続先サーバーへ切り替わる.作業を終えるときは exit を実行する.
1exit
ポートを指定する
SSHの標準ポートは 22 だ.接続先が別のポートを使っている場合は,-p で指定する.
1ssh -p 2222 user@example.com
-p は小文字だ.ファイル転送コマンドの scp ではポート指定が大文字の -P になるため,少し紛らわしい.
秘密鍵を指定する
秘密鍵を明示して接続する場合は,-i を使う.
1ssh -i ~/.ssh/id_ed25519 user@example.com
秘密鍵の権限が広すぎると,SSHが鍵の使用を拒否することがある.その場合は権限を絞る.
1chmod 600 ~/.ssh/id_ed25519
~/.ssh ディレクトリ自体の権限も絞っておく.
1chmod 700 ~/.ssh
SSH鍵を作成する
鍵がない場合は,ssh-keygen で作成する.現在なら,まず ed25519 の鍵を使う方針でよい.
1ssh-keygen -t ed25519 -C "your_email@example.com"
保存先を聞かれたら,通常はそのままEnterを押す.標準では次の2つのファイルが作成される.
1~/.ssh/id_ed25519 2~/.ssh/id_ed25519.pub
id_ed25519 が秘密鍵,id_ed25519.pub が公開鍵だ.秘密鍵は自分のPCに置き,公開鍵だけを接続先へ登録する.
公開鍵の内容を表示する.
1cat ~/.ssh/id_ed25519.pub
サーバーへ公開鍵を登録する場合は,接続先ユーザーの ~/.ssh/authorized_keys に公開鍵を追加する.GitHubへSSH接続する場合は,GitHubのSSH keys設定画面へ公開鍵を登録する.
ssh-agentへ鍵を登録する
秘密鍵にパスフレーズを設定している場合,接続のたびに入力が必要になる.ssh-agent に鍵を登録すると,毎回入力せずに接続しやすくなる.
1eval "$(ssh-agent -s)" 2ssh-add ~/.ssh/id_ed25519
登録済みの鍵は次のコマンドで確認できる.
1ssh-add -l
macOSでは,Keychainと連携してパスフレーズを保存することもできる.環境によって挙動が違うため,まずは ssh-add で登録できることを確認する.
configに接続設定を書く
毎回ユーザー名,ホスト名,ポート,秘密鍵を指定するのは面倒だ.よく使う接続先は ~/.ssh/config に書いておく.
1Host one-coder 2 HostName example.com 3 User user 4 Port 22 5 IdentityFile ~/.ssh/id_ed25519
これで,次の短いコマンドで接続できる.
1ssh one-coder
Host は手元で使う別名だ.実際のホスト名やドメイン名と同じである必要はない.複数の接続先がある場合は,Host ごとに設定を追加する.
1Host production 2 HostName one-coder.com 3 User user 4 IdentityFile ~/.ssh/id_ed25519 5 6Host github.com 7 HostName github.com 8 User git 9 IdentityFile ~/.ssh/id_ed25519
~/.ssh/config の権限も絞っておく.
1chmod 600 ~/.ssh/config
接続を詳しく確認する
接続できないときは,-v を付けると詳細ログを表示できる.
1ssh -v user@example.com
さらに詳しく見る場合は,-vv や -vvv を使う.
1ssh -vvv user@example.com
どの鍵を試しているか,どの設定が読まれているか,認証のどこで失敗しているかを確認できる.
config の設定が意図どおり解釈されているかを見る場合は,-G が便利だ.
1ssh -G one-coder
出力が多いため,必要な項目だけ確認する.
1ssh -G one-coder | grep -E '^(hostname|user|port|identityfile) '
ファイルを転送する
SSHを使った簡単なファイル転送には scp を使える.手元のファイルをサーバーへ送る例は次のとおり.
1scp ./memo.txt user@example.com:/home/user/
サーバーから手元へコピーする場合は,左右を逆にする.
1scp user@example.com:/home/user/memo.txt ./
~/.ssh/config に接続先を書いている場合は,別名を使える.
1scp ./memo.txt one-coder:/home/user/
フォルダーをまとめて転送する場合は,-r を付ける.
1scp -r ./logs user@example.com:/home/user/
この例では,手元の logs フォルダーを接続先サーバーの /home/user/ へコピーする.
秘密鍵を指定する場合は,SSHと同じように -i を使う.
1scp -i ~/.ssh/id_ed25519 ./memo.txt user@example.com:/home/user/
フォルダー転送と秘密鍵指定を組み合わせることもできる.
1scp -i ~/.ssh/id_ed25519 -r ./logs user@example.com:/home/user/
SSHのポートが 22 以外の場合は,scp では大文字の -P を使う.
1scp -P 2222 -i ~/.ssh/id_ed25519 -r ./logs user@example.com:/home/user/
よく使うコマンド
普段は,次のあたりを覚えておけば困りにくい.
1# 通常接続 2ssh user@example.com 3 4# ポート指定 5ssh -p 2222 user@example.com 6 7# 秘密鍵指定 8ssh -i ~/.ssh/id_ed25519 user@example.com 9 10# configの別名で接続 11ssh one-coder 12 13# 詳細ログを表示して接続 14ssh -v one-coder 15 16# 鍵を作成 17ssh-keygen -t ed25519 -C "your_email@example.com" 18 19# ssh-agentへ鍵を登録 20ssh-add ~/.ssh/id_ed25519 21 22# 登録済みの鍵を確認 23ssh-add -l
SSHは最初だけ覚えることが多いが,基本は「誰として,どこへ,どの鍵で接続するか」だ.ssh ユーザー名@ホスト名 から始めて,必要に応じて -p,-i,~/.ssh/config を足していけばよい.