サーバーへ接続して作業するとき,SSHはほぼ必ず使う.クラウド上のLinuxサーバーへ入るときも,GitHubへSSH認証で接続するときも,基本になる考え方は同じだ.

この記事では,LinuxやmacOSのターミナルからSSHを使うための基本をまとめる.

SSHとは

SSHは,ネットワーク越しに別のコンピューターへ安全に接続するための仕組みだ.主に次の用途で使う.

  • リモートサーバーへログインする
  • サーバー上でコマンドを実行する
  • ファイルを転送する
  • GitHubなどへSSH認証で接続する

パスワードで接続する方法もあるが,サーバー運用では公開鍵認証を使うことが多い.公開鍵認証では,自分のPCに秘密鍵を置き,接続先に公開鍵を登録する.秘密鍵は外へ出さない.

基本の接続

一番基本の形は次のとおり.

1ssh ユーザー名@ホスト名

たとえば,example.comuser として接続するならこうなる.

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 を足していけばよい.

参考