結論:sshコマンドはリモートサーバーに安全に接続・操作するためのコマンド
ssh(Secure Shell)コマンドは、ネットワークを経由して遠隔地にあるLinuxサーバーなどのコンピュータに暗号化された安全な通信でログインし、リモート操作を行うためのLinuxコマンドです。
従来のtelnetやrloginなどのプロトコルでは、通信内容(パスワードや操作ログ)が暗号化されずにプレーンテキストで送信されていたため、第三者による盗聴や改ざんのリスクがありました。これに対し、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_keys に id_ed25519.pub の中身のテキストを手動でコピーして貼り付けてください。その際、サーバー側の ~/.ssh ディレクトリは 700、authorized_keys は 600 にパーミッションを設定する必要があります。
ステップ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)の利用がおすすめです。
リモートサーバー上で tmux や screen を起動した状態で時間のかかる処理を実行しておくと、もし手元のPCのネットが切れてSSHが切断されても、サーバー上では処理が動き続けます。再接続後に tmux attach を実行することで、元の作業画面に復帰できます。
Q. ssh接続を終了(ログアウト)するには?
A. exit コマンドを実行します。
ターミナル上で exit または logout と入力してEnterを押すか、キーボードの Ctrl + D ショートカットキーを押すことで、安全にセッションを終了してローカルに戻ることができます。

コメント