ssh コマンド|ssh接続の基本から主要オプションまで解説

コマンドリファレンス
  1. 結論:sshコマンドはリモートサーバーに安全に接続・操作するためのコマンド
  2. sshコマンドの基本構文
  3. 基本的なSSH接続のコマンド例
    1. 例1: 最もシンプルなSSH接続
      1. 【重要】初回接続時に表示される確認メッセージ
    2. 例2: ユーザー名を指定してSSH接続
    3. 例3: ポート番号を指定してSSH接続(-p オプション)
    4. 例4: リモートサーバーで特定のコマンドを実行して即時終了する
    5. 例5: 詳細デバッグログを表示して接続(-v, -vv, -vvv オプション)
  4. 公開鍵認証による接続手順(鍵の生成から接続まで)
    1. ステップ1: ローカルPCで鍵ペアを生成する(ssh-keygen)
    2. ステップ2: 秘密鍵のパーミッションを設定する(chmod 600)
    3. ステップ3: サーバーに公開鍵を登録する
    4. ステップ4: 秘密鍵を指定して接続する(-i オプション)
  5. ~/.ssh/config を使った接続設定の簡略化
    1. 設定ファイルの作成・記述例
    2. 設定後の接続方法
    3. 【応用】踏み台サーバー(ProxyJump)経由の接続設定
  6. 応用:ポートフォワーディング(SSHトンネル)
    1. ローカルポートフォワーディング(-L オプション)
    2. トンネル専用オプション(-N, -f オプション)
  7. sshコマンドの主要オプション一覧
  8. SSH接続できないときのトラブルシューティング(エラー別の解決策)
    1. 1. Permission denied (publickey)
    2. 2. Host key verification failed
    3. 3. WARNING: UNPROTECTED PRIVATE KEY FILE!
    4. 4. Connection refused
    5. 5. Connection timed out
  9. 安全な運用のためのサーバー側設定(ベストプラクティス)
  10. 関連コマンド
  11. よくある質問(FAQ)
    1. Q. Windowsでもsshコマンドは使えますか?
    2. Q. SSH接続のセッションを維持したい、途中で回線が切れてもコマンドを実行し続けたい場合は?
    3. Q. ssh接続を終了(ログアウト)するには?
  12. 参考
  13. 関連記事

結論:sshコマンドはリモートサーバーに安全に接続・操作するためのコマンド

ssh(Secure Shell)コマンドは、ネットワークを経由して遠隔地にあるLinuxサーバーなどのコンピュータに暗号化された安全な通信でログインし、リモート操作を行うためのLinuxコマンドです。

従来のtelnetrloginなどのプロトコルでは、通信内容(パスワードや操作ログ)が暗号化されずにプレーンテキストで送信されていたため、第三者による盗聴や改ざんのリスクがありました。これに対し、sshコマンドはすべての通信(認証情報や送信データ)を自動的に暗号化するため、インターネット上でも安全にサーバーを遠隔管理できます。

SSH接続における認証方式には、主に以下の2種類があります。

  • パスワード認証:ユーザー名とパスワードを入力してログインする最もシンプルな方式。総当たり攻撃(ブルートフォース攻撃)に弱いデメリットがあります。
  • 公開鍵認証(推奨):手元のローカルPCにある「秘密鍵」と、サーバーにあらかじめ登録しておいた「公開鍵」のペアで認証する安全な方式。パスワードを入力しないため、不正ログインのリスクを劇的に下げることができます。

sshコマンドの基本構文

sshコマンドの基本的な構文は以下の通りです。

ssh [オプション] [ユーザー名@]ホスト名 [コマンド]
  • オプション:ポート番号の指定(-p)や、秘密鍵の指定(-i)などを指定します。
  • ユーザー名:接続先サーバーのログインユーザー名。省略した場合、現在ローカルPCでログインしているユーザー名が自動的に使われます。
  • ホスト名:接続先サーバーのIPアドレス(例: 192.168.1.100)またはドメイン名(例: example.com)。
  • コマンド:接続と同時にリモートサーバーで実行したいコマンドを指定します。指定しない場合は、通常通りリモートのシェル(ターミナル画面)が起動します。

基本的なSSH接続のコマンド例

実務でよく使われる基本的な接続パターンを紹介します。

例1: 最もシンプルなSSH接続

ssh example.com

ローカルPCの現在と同じユーザー名で、リモートの example.com に接続します。

【重要】初回接続時に表示される確認メッセージ

初めて特定のサーバーに接続する際、ターミナルに以下のような警告が表示されます。

The authenticity of host 'example.com (203.0.113.1)' can't be established.
ED25519 key fingerprint is SHA256:abc123XYZ...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

これは、「接続先のサーバーが本当に意図した本物のサーバーかどうか(なりすましや中間者攻撃ではないか)」を確認するための警告です。信頼できる接続先であれば yes と入力してEnterを押します。

すると、以下のようにローカルPCの ~/.ssh/known_hosts ファイルに相手のホストキー(公開鍵)が記録され、次回以降はこの確認メッセージが表示されなくなります。

Warning: Permanently added 'example.com' (ED25519) to the list of known hosts.
user@example.com's password:

例2: ユーザー名を指定してSSH接続

ssh admin@192.168.1.10

admin というユーザー名を指定して、IPアドレス 192.168.1.10 のサーバーに接続します。実務では ユーザー名@ホスト名 の形式で接続するのが最も一般的です。

例3: ポート番号を指定してSSH接続(-p オプション)

ssh -p 2222 user@example.com

SSHのデフォルトのポート番号は 22 です。しかし、セキュリティ対策のために待受ポートを変更しているサーバーに接続する場合は、小文字の -p オプションでポート番号を指定する必要があります(※scpコマンドでは大文字 of -P を使うため混同に注意してください)。

サーバー側のSSHポート変更手順や疎通確認については、SSH ポートの変更方法|デフォルト22番から変更する手順と接続・確認方法 で詳しく解説しています。

例4: リモートサーバーで特定のコマンドを実行して即時終了する

ssh user@example.com "ls -la /var/log"

ホスト名の後ろにダブルクォーテーションで囲んだコマンドを指定すると、リモートサーバーに接続してそのコマンドだけを実行し、結果をローカルの画面に出力した後に自動でログアウト(切断)します。

バックアップスクリプトの実行や、複数サーバーのディスク容量をチェックするシェルスクリプトなど、自動化処理で非常によく使われる手法です。

例5: 詳細デバッグログを表示して接続(-v, -vv, -vvv オプション)

ssh -v user@example.com

SSH接続がうまくいかない原因を調べる際、-v オプションを付与すると詳細な接続プロセス(デバッグログ)が画面に出力されます。鍵の認証フェーズやポート接続の成否を特定するのに役立ちます。さらに詳細なログが必要な場合は、-vv-vvv のように v を増やします。

公開鍵認証による接続手順(鍵の生成から接続まで)

セキュリティを高めるために実務で必須となる「公開鍵認証」によるSSH接続の手順を解説します。

ステップ1: ローカルPCで鍵ペアを生成する(ssh-keygen)

まずは手元のパソコンで、秘密鍵と公開鍵のペアを作ります。暗号強度が高く、動作の軽い Ed25519 方式での生成が推奨されています。

ssh-keygen -t ed25519

実行すると保存先やパスフレーズ(鍵を使用するためのパスワード)を聞かれますが、基本的にはすべてEnterキーを連打してデフォルト設定で進めて構いません。完了すると、~/.ssh/ ディレクトリに以下の2つのファイルが作成されます。

  • id_ed25519秘密鍵(絶対に他人に渡してはいけない)
  • id_ed25519.pub公開鍵(接続先のサーバーに登録するもの)

ステップ2: 秘密鍵のパーミッションを設定する(chmod 600)

SSHの仕様上、秘密鍵のアクセス権限(パーミッション)が適切でないと、セキュリティエラーになり接続できません。以下のコマンドを実行し、所有者のみが読み書き可能(600)な状態にしておきます。

chmod 600 ~/.ssh/id_ed25519

ステップ3: サーバーに公開鍵を登録する

サーバー側に、先ほど作成した公開鍵(.pubの方)を登録します。自動登録コマンド ssh-copy-id を使うのが簡単です。

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@example.com

サーバーのログインパスワードを入力すると、自動的にサーバー内の ~/.ssh/authorized_keys ファイルへ公開鍵が追記されます。

ssh-copy-id コマンドが使えない場合は、サーバー上の ~/.ssh/authorized_keysid_ed25519.pub の中身のテキストを手動でコピーして貼り付けてください。その際、サーバー側の ~/.ssh ディレクトリは 700authorized_keys600 にパーミッションを設定する必要があります。

ステップ4: 秘密鍵を指定して接続する(-i オプション)

準備ができたら、-i オプションで秘密鍵のパスを指定して接続します。

ssh -i ~/.ssh/id_ed25519 user@example.com

正しく公開鍵が登録されていれば、パスワード入力なし(または鍵生成時に設定したパスフレーズのみ)でログインが成功します。

~/.ssh/config を使った接続設定の簡略化

毎回 -p 2222-i ~/.ssh/id_ed25519 などの長いオプションを入力するのは非効率的です。ローカルPCの ~/.ssh/config というテキストファイルを設定しておくと、接続が驚くほど簡単になります。

設定ファイルの作成・記述例

ファイルがない場合は ~/.ssh/config を作成し、以下のように記述します。

# ~/.ssh/config の設定例
Host my-server
    HostName example.com
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
  • Host:接続時に指定する任意のエイリアス名(ショートカット名)。
  • HostName:サーバーの実際のIPアドレスやドメイン名。
  • User:ログインするユーザー名。
  • Port:SSHの待受ポート番号。
  • IdentityFile:使用する秘密鍵のパス。
  • ServerAliveInterval:接続維持(KeepAlive)のためのパケット送信間隔(秒)。無操作でセッションが切断されるのを防ぎます。

設定後の接続方法

この設定を行っておけば、ターミナルで以下を叩くだけで、自動的に指定 of ポートや鍵を使って接続してくれます。

ssh my-server

【応用】踏み台サーバー(ProxyJump)経由の接続設定

ファイアウォールで保護されたプライベートネットワーク上のサーバーに、パブリックな「踏み台サーバー(Bastion)」を経由してアクセスしたい場合、ProxyJump-J オプションに相当)を利用します。

configファイルに以下のように記述します。

# 踏み台サーバーの設定
Host bastion
    HostName bastion.example.com
    User bastion-user
    IdentityFile ~/.ssh/id_ed25519

# 本番ターゲットサーバーの設定(踏み台経由)
Host target-server
    HostName 10.0.1.50
    User target-user
    IdentityFile ~/.ssh/id_ed25519_target
    ProxyJump bastion

この設定により、ssh target-server と実行するだけで、自動的に bastion サーバーを踏み台にして内部の target-server に安全に接続できます。

コマンドラインで直接指定する場合は、大文字の -J オプションを使用します。

ssh -J bastion-user@bastion.example.com target-user@10.0.1.50

SSH configのより詳細な記述オプションや複数環境の使い分けについては、SSH configの書き方|~/.ssh/configで接続設定をまとめる方法 で詳しくまとめています。

応用:ポートフォワーディング(SSHトンネル)

SSH接続には、リモートサーバーを経由して手元のPC(ローカル)と外部のサーバーの間で安全な暗号化トンネルを作る「ポートフォワーディング」機能があります。セキュリティ上、外部に直接公開できない内部サービスに安全にアクセスしたい場合に重宝します。

ローカルポートフォワーディング(-L オプション)

ローカルPCの特定のポートに届いた通信を、SSHサーバーを経由して目的の宛先に転送する機能です。

ssh -L [ローカル待受ポート]:[転送先ホスト]:[転送先ポート] ユーザー名@SSHホスト

【具体的なユースケース】
サーバー上で動いているMySQLデータベース(ポート 3306)は、通常セキュリティのためにインターネット側から直接アクセスできません。しかし、ローカルポートフォワーディングを使うことで、手元のPCから安全に接続できます。

ssh -L 13306:localhost:3306 user@example.com

このコマンドを実行した状態で、ローカルPCのツールなどから localhost:13306 にアクセスすると、その通信はSSH経由で暗号化されて example.com のサーバーに送られ、そこからサーバー内部の localhost:3306(MySQL)へ届きます。

トンネル専用オプション(-N, -f オプション)

ポートフォワーディングだけを行いたい(接続先のシェルを開いたりリモートコマンドを実行したりする必要がない)場合は、以下のオプションを組み合わせると便利です。

  • -N:リモートコマンドを実行しない(ポートフォワードのみを行う)。
  • -f:SSH接続をバックグラウンドに送る。
ssh -f -N -L 13306:localhost:3306 user@example.com

このコマンドを実行すると、ターミナルを専有することなくバックグラウンドでポートフォワーディングが維持されます。終了したい場合は、kill コマンド等でプロセスを停止します。

sshコマンドの主要オプション一覧

sshコマンドで使用される主要なオプションをまとめました。

オプション 説明 具体的な使用例
-p PORT 接続先のSSHポート番号を指定(デフォルトは22) ssh -p 2222 user@host
-i FILE 認証に使用する秘密鍵ファイルを指定 ssh -i ~/.ssh/id_rsa user@host
-l USER ログインするユーザー名を指定(user@hostの代替) ssh -l admin host
-v 詳細ログ(デバッグ情報)を出力。最大で -vvv まで指定可能 ssh -vv user@host
-J BASTION 踏み台サーバー(ProxyJump)経由で接続 ssh -J bastion-user@bastion host
-L [L_PORT]:[HOST]:[PORT] ローカルポートフォワーディング(手元のポートをリモートへ転送) ssh -L 8080:localhost:80 user@host
-R [R_PORT]:[HOST]:[PORT] リモートポートフォワーディング(リモートのポートを手元へ転送) ssh -R 9090:localhost:3000 user@host
-N リモートコマンドを実行しない(ポートフォワード時などに使用) ssh -N -L 8080:localhost:80 user@host
-f 認証後にSSHプロセスをバックグラウンドで実行 ssh -f -N -L 8080:localhost:80 user@host
-T 擬似端末(tty)を割り当てない(Gitの接続確認などで使用) ssh -T git@github.com
-C 転送データを圧縮して通信速度を向上させる(低速回線向け) ssh -C user@host
-X X11グラフィック転送を有効にする(GUIアプリをローカルに表示) ssh -X user@host
-o OPTION ssh_configの設定を一時的にコマンドラインから上書き指定 ssh -o StrictHostKeyChecking=no user@host

SSH接続できないときのトラブルシューティング(エラー別の解決策)

SSH接続でよく遭遇するエラーと、その原因および解決策をまとめました。詳細な切り分け手順は、SSH接続できないときのチェックリスト にも解説しています。

1. Permission denied (publickey)

【原因】
サーバー側の認証に失敗しています。公開鍵認証を使用している場合、指定した秘密鍵が間違っているか、あるいはサーバー側の ~/.ssh/authorized_keys に正しく公開鍵が登録されていない可能性があります。

【対策】

  • ssh -i [秘密鍵パス] で指定している鍵のファイルパスが正しいか確認する。
  • サーバー側の authorized_keys に公開鍵(.pub の中身)が正しく登録されているか、末尾に余計な改行や文字が入っていないか確認する。
  • サーバー側の .ssh ディレクトリ(700)および authorized_keys(600)のパーミッション設定が正しいか確認する。

2. Host key verification failed

【原因】
サーバーのOSを再インストールしたり、同じIPアドレスを持つ別のサーバーに入れ替わったりした際、ローカルPCの known_hosts に登録されている古い公開鍵と、接続先サーバーの現在の公開鍵が一致しない場合に発生するセキュリティエラーです。

【対策】
安全であることが確認できている場合、以下のコマンドで known_hosts から該当する古いホスト情報を削除します。

ssh-keygen -R [接続先のIPアドレスまたはホスト名]

削除後、再度接続すると初回接続時と同じフィンガープリント確認が表示されるため、yes と答えることで新しい鍵が登録され、接続できるようになります。

3. WARNING: UNPROTECTED PRIVATE KEY FILE!

【原因】
ローカルPCにある秘密鍵ファイルのパーミッション(アクセス権限)が広すぎる(例: 他のユーザーも読める状態)ため、安全のためにSSHコマンドが接続を拒否しています。

【対策】
秘密鍵のパーミッションを所有者のみの読み書き許可(600)に変更します。

chmod 600 ~/.ssh/id_ed25519

4. Connection refused

【原因】
サーバーの指定したポート番号にアクセスを拒否されています。SSHデーモンが動いていないか、ポート番号の設定が間違っています。

【対策】

  • ポート番号(-p)の指定が正しいか再確認する。
  • サーバー側でSSHサービスが稼働しているか確認する(systemctl status sshd など)。

5. Connection timed out

【原因】
サーバーからの応答がなく、タイムアウトしています。ネットワークの不通や、ファイアウォール(クラウド環境のセキュリティグループやfirewalldなど)でポートが遮断されている可能性が高いです。

【対策】

  • IPアドレスが間違っていないか、ping 等で疎通確認を行う。
  • ファイアウォール設定で、接続先ポート(22番など)が自分の接続元IPアドレスから許可されているか確認する。

安全な運用のためのサーバー側設定(ベストプラクティス)

最後に、SSHサーバー(接続される側)を安全に運用するための /etc/ssh/sshd_config の推奨設定を紹介します。

# /etc/ssh/sshd_config の推奨セキュリティ設定例

# 1. 待受ポートをデフォルトの22番から別のポート(例: 20022)に変更
Port 20022

# 2. rootユーザーでの直接ログインを禁止
PermitRootLogin no

# 3. パスワード認証を禁止し、公開鍵認証のみにする
PasswordAuthentication no
PubkeyAuthentication yes

設定を変更した後は、SSHサービスを再起動(sudo systemctl restart sshd)することで反映されます。※設定を変更した際は、接続している現在のSSHセッションを切断する前に、必ず**新しいターミナル窓を開いて別セッションで接続テスト**を行ってください。設定ミスがあった場合に締め出されてしまうのを防ぐためです。

関連コマンド

SSHに関連する便利なコマンドの一覧です。

  • scp:SSH通信を使って、ローカルPCとリモートサーバー間でファイルを安全にコピーするコマンド。
  • sftp:SSH通信を使って、対話的にファイルを送受信するコマンド。FTPと同様の操作感を安全に行えます。
  • ssh-copy-id:ローカルで作ったSSH公開鍵を、リモートサーバーの authorized_keys に簡単かつ自動で配置・設定するツール。

よくある質問(FAQ)

Q. Windowsでもsshコマンドは使えますか?

A. はい、使えます。
現在のWindows 10およびWindows 11には標準で「OpenSSHクライアント」がインストールされています。そのため、コマンドプロンプトやPowerShellから、macOSやLinuxと同じ ssh コマンドを使って接続可能です。鍵の生成手順やオプションも共通です。

Q. SSH接続のセッションを維持したい、途中で回線が切れてもコマンドを実行し続けたい場合は?

A. ターミナルマルチプレクサ(tmux や screen)の利用がおすすめです。
リモートサーバー上で tmuxscreen を起動した状態で時間のかかる処理を実行しておくと、もし手元のPCのネットが切れてSSHが切断されても、サーバー上では処理が動き続けます。再接続後に tmux attach を実行することで、元の作業画面に復帰できます。

Q. ssh接続を終了(ログアウト)するには?

A. exit コマンドを実行します。
ターミナル上で exit または logout と入力してEnterを押すか、キーボードの Ctrl + D ショートカットキーを押すことで、安全にセッションを終了してローカルに戻ることができます。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント