前回の投稿では、SSHキーの作成(key generation)を通して、安全なSSH接続の準備を整えました。

前回の投稿を見る : SSH keygen: 初心者のための完全ガイド

今回はいよいよ、SSHでリモートサーバーに接続する基本を学びます。SSHコマンド自体は思っているよりシンプルですが、いくつかの原則と便利なオプションを知っておくと、作業がぐっと快適になります。


SSHコマンドはどう書けばいい?



SSHコマンドの基本形は次の通りです。

ssh [オプション] [ユーザー名]@[ホストアドレス] [コマンド]

それぞれが何を意味するのか、順番に見ていきましょう。

  1. ssh:SSHクライアントを起動するコマンドです。
  2. [オプション]:接続方法を調整するための指定です。鍵ファイルの選択、ポートの指定、ポートフォワーディングなどができます(後で詳しく紹介します)。
  3. [ユーザー名]:接続先(リモートサーバー)のユーザー名です。ローカルと同じユーザー名で接続する場合は省略できることがあります。
  4. [ホストアドレス]:接続先のIPアドレスまたはドメイン名です。
  5. [コマンド](任意):接続後すぐにリモート側で実行したいコマンドがある場合に指定します。コマンドが実行されるとSSHセッションは終了します。省略すると、ログインして対話型シェル(シェル操作)を行えます。

覚えやすいコツ:SSHコマンドの「芯」

SSHコマンドの核心はとてもシンプルです。

  • 基本原則: ssh ユーザー名@ホストアドレス

  • 例: ssh ubuntu@192.168.1.100(192.168.1.100のubuntuユーザーとして接続)

  • 例: ssh root@mywebserver.commywebserver.comrootユーザーとして接続)
  • 覚え方:

    • 「誰として(ユーザー名)、どこへ(ホスト)入るか」だけをまず押さえる。
    • ssh(接続する)→ ユーザー名@(誰として)→ ホスト(どこへ)

また、よく使う接続先は ~/.ssh/config を使うと、長いアドレスやオプションを毎回入力しなくて済みます(この話は次回の記事で詳しく取り上げます)。


便利なSSHオプションを解剖する

SSHには用途に応じて使える便利なオプションが多数あります。ここでは実務でもよく登場するものを中心に紹介します。

SSH妖精がオプションを案内する場面

1. -i <IdentityFile>:使う秘密鍵ファイルを指定する

複数のSSHキーを使い分けているとき、接続先ごとに「この鍵で接続したい」を明示するために使います。通常は ~/.ssh/id_rsa~/.ssh/id_ed25519 が使われますが、鍵を複数管理する場合は -i が便利です。

  • 使い方: ssh -i ~/.ssh/my_custom_key ubuntu@my_server.com
  • 例:
ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com
Enter passphrase for key '/home/youruser/.ssh/id_ed25519_my_server':

2. -p <Port>:SSHポートを指定する

SSHサーバーの標準ポートは22番ですが、セキュリティ上の理由で別ポートに変更して運用されていることも多いです。その場合は -p でポート番号を指定して接続します。

  • 使い方: ssh -p 2222 your_user@your_server.com
  • 例:
ssh -p 2222 myuser@192.168.1.100
The authenticity of host '192.168.1.100:2222 (...)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100:2222' (ED25519) to the list of known hosts.
Last login: Mon Jun 17 10:00:00 2024 from your_ip
myuser@server:~ $

3. -X:X11フォワーディングを有効にする(GUIアプリを表示する)

リモートサーバー上でGUIアプリを起動し、その画面をローカルに表示して操作したい場合に使います。X Window System を利用するため、ローカル側でもXサーバーが必要です(macOSならXQuartz、WindowsならPuTTY + VcXsrvなど)。

  • 使い方: ssh -X your_user@your_server.com
  • 例:
ssh -X myuser@remote-gui-server.com
myuser@remote-gui-server:~ $ firefox &

リモートで起動した firefox のウィンドウがローカルに表示されます。ネットワーク遅延が大きい環境では操作が重く感じることがあります。

4. -L <LocalPort>:<RemoteHost>:<RemotePort>:ローカルポートフォワーディング(Local Port Forwarding)

ローカル側のポート(LocalPort)に入ってきた通信を、SSHトンネルを通じてリモート側(RemoteHost:RemotePort)へ転送する機能です。ファイアウォールの内側にあるサービスへ安全に到達したい場合や、ローカルのアプリからリモートDBへ接続したい場合などに活躍します。

  • 使い方: ssh -L 8080:localhost:80 your_user@your_server.com

  • ローカルの 8080 番に来た通信を、your_server.com 上の localhost:80(= サーバー自身の80番)へ転送します。

  • 例:

  • リモートのWebサーバー(80番)に直接アクセスできないが、SSHは可能な場合:

ssh -L 8080:localhost:80 myuser@my_web_server.com

この状態でローカルのブラウザから http://localhost:8080 を開くと、実際には my_web_server.com の80番へアクセスしているのと同じ結果になります。

  • ローカルの my_db_app が、リモート内部ネットワークの db_server.internal:3306(MySQL)へ接続する必要があるが、db_server.internal へは my_app_server.com からしか到達できない場合:
ssh -L 3307:db_server.internal:3306 myuser@my_app_server.com

このトンネルを張った後、ローカルの my_db_applocalhost:3307 に接続すれば、my_app_server.com を経由して db_server.internal:3306 に到達します。 (3307 を使うのは、ローカルで 3306 を既に使用している可能性があるためです。)

5. -N:リモートでコマンドを実行せず、トンネルだけを維持する

-L-D(Dynamic Port Forwarding / SOCKSプロキシ)と組み合わせて使い、「ログインして操作する」のではなく「フォワーディング用トンネルだけを張り続ける」用途で便利です。

  • 使い方: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • 例:
ssh -N -L 8080:localhost:80 myuser@my_web_server.com &

バックグラウンド(&)でトンネルを維持し、ローカルのブラウザからアクセスできる状態を保てます。

6. -f:接続後にSSHプロセスをバックグラウンドへ送る

SSH接続が確立した後、クライアントプロセスをバックグラウンドへ送ります。-N と組み合わせて、ポートフォワーディングを常駐させたいときによく使います。

  • 使い方: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • 例:
ssh -f -N -L 8080:localhost:80 myuser@my_web_server.com

実行するとすぐにターミナル操作が戻り、SSHトンネルはバックグラウンドで動き続けます。ps aux | grep ssh などでプロセスを確認できます。


まとめ

今回はSSHコマンドの基本構造と、実務でよく使う主要オプションを整理しました。特に -p によるポート指定と -L によるポートフォワーディングは登場頻度が高いので、ぜひ手元で一度試して感覚を掴んでみてください。

次回は ~/.ssh/config を活用して、接続設定をもっとスマートに管理する方法を紹介します。疑問があれば、いつでもコメントでお知らせください!


連関ポスト

-あなたのSSHサーバーは安全ですか?SSHサーバーログによるハッキングの兆候完全解析