「サーバーにリモートで接続したいけど、SSHの使い方がわからない」——クラウドサーバーやVPSを触り始めた方が最初にぶつかる壁のひとつがSSHコマンドです。
SSHはリモートサーバーに暗号化通信で安全にアクセスするための標準プロトコルです。基本的な接続コマンドから鍵認証の設定・便利なオプション・ファイル転送・ポートフォワーディングまで、この記事でSSHコマンドの実践的な使い方を体系的に解説します。
SSHコマンドとは

SSHの基本概念と用途
SSH(Secure Shell)は、ネットワーク越しに別のコンピューター(リモートサーバー)を安全に操作するためのプロトコルおよびコマンドです。1995年に開発され、現在ではLinuxサーバー・クラウド環境・ネットワーク機器の管理に欠かせない標準ツールとなっています。
主な用途は以下の通りです。
- リモートサーバーへのコマンドライン操作
- クラウドサーバー(AWS EC2・GCPなど)への接続・管理
- ファイルのアップロード・ダウンロード(scp・sftp)
- ポートフォワーディングによるセキュアなトンネル通信
- GitHubなどのバージョン管理サービスとの認証連携
リモートサーバーに安全に接続する仕組み
SSHは通信内容を暗号化することで、ネットワーク上での盗聴・改ざんを防ぎます。接続時には以下のプロセスで安全な通信路が確立されます。
- 手順1: クライアントがサーバーに接続要求を送る
- 手順2: サーバーが公開鍵(ホストキー)を送信する
- 手順3: クライアントがホストキーを検証して正規のサーバーかを確認する
- 手順4: 双方で暗号鍵を交換してセッションを暗号化する
- 手順5: 認証(パスワードまたは鍵認証)を完了してシェルセッションを開始する
SSHとTelnetの違い
| 比較項目 | SSH | Telnet |
|---|---|---|
| 通信の暗号化 | あり(強力な暗号化) | なし(平文通信) |
| デフォルトポート | 22番 | 23番 |
| セキュリティ | 高い | 低い(盗聴リスクあり) |
| 現在の使用状況 | 標準的に使用される | ほぼ非推奨・廃止傾向 |
| 認証方式 | パスワード・鍵認証 | パスワードのみ |
Telnetは通信内容が平文でネットワーク上に流れるため、現在のインターネット環境での使用は危険です。リモート接続にはSSHを使ってください。
SSHコマンドの基本構文

基本的な接続方法
ssh ユーザー名@ホスト名 の使い方
SSHの最も基本的な接続構文は以下の通りです。
ssh ユーザー名@ホスト名またはIPアドレス
具体的な使用例です。
# IPアドレスで接続する場合
ssh [email protected]
# ドメイン名で接続する場合
ssh [email protected]
# AWSのEC2インスタンスに接続する場合(Ubuntu)
ssh [email protected]
初回接続時は以下のメッセージが表示されます。
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yesと入力すると、サーバーのホストキーが~/.ssh/known_hostsに保存されて次回以降は表示されません。
ポート番号指定で接続する方法
ssh -p ポート番号 ユーザー名@ホスト名
SSHのデフォルトポートは22番です。サーバー側でポート番号を変更している場合は-pオプションで指定します。
# ポート2222に接続する場合
ssh -p 2222 [email protected]
# 鍵ファイルとポートを同時に指定する場合
ssh -p 2222 -i ~/.ssh/id_rsa [email protected]
ユーザー名を省略した場合の挙動
ユーザー名を省略した場合、SSHクライアントはローカルPCの現在のログインユーザー名をそのまま使用して接続を試みます。
# ユーザー名省略(ローカルのユーザー名で接続を試みる)
ssh 192.168.1.10
# 上記は以下と同じ意味
ssh $(whoami)@192.168.1.10
Tips: ローカルのユーザー名とリモートのユーザー名が異なる場合は必ずユーザー名を明示的に指定してください。省略すると認証失敗になります。
SSH接続の準備

リモートサーバーのIPアドレスまたはドメインを確認
SSH接続に必要な情報を事前に確認します。
| 必要な情報 | 確認方法 |
|---|---|
| サーバーのIPアドレス | VPS/クラウドのコントロールパネル・hostname -Iコマンド |
| SSHのポート番号 | サーバー管理者に確認(デフォルトは22) |
| ログインユーザー名 | VPSの初期設定メール・サーバー管理者 |
| 認証方式 | パスワードまたは鍵認証 |
ユーザーアカウントの作成と権限設定
サーバーに新しいユーザーを作成してSSH接続用のアカウントを準備します。
# 新規ユーザーの作成
sudo adduser newuser
# sudoグループへの追加(管理者権限を付与する場合)
sudo usermod -aG sudo newuser
# ユーザーの確認
id newuser
初回接続時のホストキー認証
初回接続時に表示されるホストキーの確認は、接続先が正規のサーバーであることを検証する重要なセキュリティプロセスです。フィンガープリントの値をサーバー管理者や信頼できる情報源と照合してからyesと入力することを推奨します。
サーバー側でフィンガープリントを確認するコマンドは以下の通りです。
# サーバー側でホストキーのフィンガープリントを確認
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
SSH鍵認証の設定方法
公開鍵・秘密鍵の基本概念
SSH鍵認証は公開鍵暗号方式を使ったパスワード不要の認証方法です。2種類の鍵ペアを使います。
| 鍵の種類 | 保存場所 | 役割 |
|---|---|---|
| 秘密鍵(Private Key) | クライアント(自分のPC) | 認証に使う鍵。絶対に外部に渡してはいけない |
| 公開鍵(Public Key) | リモートサーバー | サーバーに登録する鍵。外部に公開してよい |
サーバーは接続時に公開鍵を使って認証チャレンジを作成し、クライアントが秘密鍵で正しく応答できた場合にのみ接続を許可します。
鍵ペアの生成方法
ssh-keygen コマンドの使い方
ssh-keygenコマンドでクライアント(自分のPC)上に鍵ペアを生成します。
# RSA鍵(4096bit)の生成(推奨)
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# Ed25519鍵の生成(より安全・推奨)
ssh-keygen -t ed25519 -C "[email protected]"
コマンド実行後のプロンプトへの対応です。
Enter file in which to save the key (/home/user/.ssh/id_rsa):
# → そのままEnterで~/.ssh/id_rsaに保存(推奨)
Enter passphrase (empty for no passphrase):
# → パスフレーズを設定(セキュリティ向上のため推奨)
Enter same passphrase again:
# → 同じパスフレーズを再入力
生成されるファイルは以下の2つです。
~/.ssh/id_rsa # 秘密鍵(絶対に外部に渡さない)
~/.ssh/id_rsa.pub # 公開鍵(サーバーに登録する)
公開鍵をサーバーに登録する方法
方法1:ssh-copy-idコマンドを使う(推奨)
# ssh-copy-idで公開鍵をサーバーに自動登録
[email protected]
# ポート番号を指定する場合
ssh-copy-id -p 2222 [email protected]
方法2:手動で登録する
# クライアント側:公開鍵の内容を確認してコピー
cat ~/.ssh/id_rsa.pub
# サーバー側:~/.ssh/ディレクトリの作成と権限設定
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# サーバー側:公開鍵をauthorized_keysに追記
echo "公開鍵の内容をここに貼り付ける" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
権限設定は必須です。~/.sshのパーミッションが700、authorized_keysのパーミッションが600でないと鍵認証が機能しません。
パスワード不要で接続する設定
公開鍵の登録が完了したら、秘密鍵を指定して接続します。
# 秘密鍵を明示的に指定して接続
ssh -i ~/.ssh/id_rsa [email protected]
# デフォルトの鍵(~/.ssh/id_rsa)を使う場合はオプション不要
ssh [email protected]
パスフレーズを設定した場合は接続時にパスフレーズの入力が求められます。ssh-agentを使うとパスフレーズの入力を1回に省略できます。
# ssh-agentを起動して秘密鍵を登録
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
SSHコマンドの便利オプション
接続時にコマンドを指定して実行する方法
ssh ユーザー名@ホスト名 コマンド
SSHでリモートサーバーにログインせず、コマンドを1回だけ実行して結果を受け取ることができます。
# リモートサーバーのディスク使用量を確認
ssh [email protected] df -h
# リモートサーバーで複数コマンドを実行
ssh [email protected] "uptime && free -m && df -h"
# スクリプトファイルをリモートで実行
ssh [email protected] "bash -s" < local_script.sh
💡 上級者Tips: この方法を使うと、複数サーバーへの同一コマンドの一括実行をシェルスクリプトで自動化できます。
接続の詳細ログを表示するオプション
-v、-vv オプションの活用
SSH接続が失敗した場合のデバッグに-vオプションが役立ちます。
# 基本的なデバッグ情報を表示
ssh -v [email protected]
# より詳細なデバッグ情報を表示
ssh -vv [email protected]
# 最も詳細なデバッグ情報を表示(問題の特定に有効)
ssh -vvv [email protected]
-vオプションの出力から接続失敗の主な原因を特定できます。
| 出力メッセージ | 意味・原因 |
|---|---|
Connection refused |
SSHサービスが起動していない・ポート番号が違う |
No route to host |
IPアドレスが間違い・ネットワーク到達不能 |
Permission denied |
認証失敗(パスワード・鍵が違う) |
Host key verification failed |
known_hostsのホストキーが変更されている |
接続タイムアウトや接続制御の設定
-o ConnectTimeout の利用方法
-oオプションでSSHの各種設定をコマンドラインから指定できます。
# 接続タイムアウトを5秒に設定
ssh -o ConnectTimeout=5 [email protected]
# パスワード認証を無効にして鍵認証のみ許可
ssh -o PasswordAuthentication=no [email protected]
# ホストキーのチェックをスキップ(テスト環境のみ。本番環境では非推奨)
ssh -o StrictHostKeyChecking=no [email protected]
# 複数オプションを組み合わせる
ssh -o ConnectTimeout=10 -o ServerAliveInterval=60 [email protected]
ServerAliveIntervalについて: 長時間の作業では-o ServerAliveInterval=60を指定すると、無通信による接続切断を防げます。
SSHの応用操作
リモートファイル転送(scp, sftp)の基本
SSHプロトコルを使ったファイル転送コマンドは2つあります。scpとsftpの詳しい使い方と実践例はこちらの記事も参考になります。
scpコマンド(シンプルなファイルコピー):
# ローカル→リモートへファイル送信
scp local_file.txt [email protected]:/home/user/
# リモート→ローカルへファイル受信
scp [email protected]:/home/user/remote_file.txt ./
# ディレクトリごと転送(-rオプション)
scp -r local_dir/ [email protected]:/home/user/
# ポート番号を指定する場合(-Pは大文字)
scp -P 2222 local_file.txt [email protected]:/home/user/
sftpコマンド(対話型ファイル転送):
# SFTP接続を開始
sftp [email protected]
# SFTP接続後の主なコマンド
sftp> ls # リモートのファイル一覧
sftp> pwd # リモートの現在ディレクトリ
sftp> get file.txt # リモートからダウンロード
sftp> put file.txt # リモートへアップロード
sftp> exit # SFTPセッションを終了
ポートフォワーディングによる安全な接続
ポートフォワーディングはSSHトンネルを使って、直接アクセスできないリモートサービスに安全にアクセスする技術です。
ローカルフォワーディング(ローカル→リモート):
# ローカルの8080番ポートをリモートの80番ポートに転送
ssh -L 8080:localhost:80 [email protected]
# 使用例:リモートのMySQLに安全にアクセス
ssh -L 3307:localhost:3306 [email protected]
# → ローカルで mysql -h 127.0.0.1 -P 3307 で接続可能になる
リモートフォワーディング(リモート→ローカル):
# リモートの9090番ポートをローカルの3000番ポートに転送
ssh -R 9090:localhost:3000 [email protected]
複数サーバーへの一括接続
~/.ssh/configファイルを活用すると、複数のサーバー設定を管理して効率よく接続できます。
# ~/.ssh/config の設定例
Host web-server
HostName 192.168.1.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_rsa
Host db-server
HostName 192.168.1.20
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
設定後はホスト名のエイリアスで接続できます。
# 設定ファイルのエイリアスで接続
ssh web-server
ssh db-server
SSHトンネルを使ったセキュアな通信
ダイナミックフォワーディングを使うと、SSHサーバーをプロキシとして経由した安全な通信が可能になります。
# SOCKSプロキシとしてSSHトンネルを作成
ssh -D 1080 [email protected]
# バックグラウンドで実行する場合
ssh -D 1080 -N -f [email protected]
SSH接続の注意点
パスワード認証のセキュリティリスク
パスワード認証はブルートフォース攻撃(総当たり攻撃)のターゲットになりやすく、公開サーバーではパスワード認証を無効化することを強く推奨します。
パスワード認証を無効にする設定は/etc/ssh/sshd_configで行います。
# /etc/ssh/sshd_config の設定
PasswordAuthentication no # パスワード認証を無効化
PubkeyAuthentication yes # 公開鍵認証を有効化
PermitRootLogin no # rootでの直接ログインを禁止
# 設定変更後はSSHサービスを再起動
sudo systemctl restart sshd
重要: パスワード認証を無効にする前に、鍵認証での接続が確実に動作することを確認してください。鍵認証なしに無効化するとサーバーにアクセスできなくなります。
公開鍵認証の安全な管理方法
- 秘密鍵は
~/.ssh/ディレクトリに保存し、パーミッションを600に設定する - 秘密鍵には必ずパスフレーズを設定する
- 秘密鍵をメール・Slack・GitHubなどに貼り付けない
- 不要になった公開鍵は
authorized_keysから削除する - 鍵ペアは定期的に更新することを推奨する
ホストキーの確認と警告メッセージへの対応
以下の警告はサーバーのホストキーが変更されたことを示します。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
この警告が表示された場合、以下の原因が考えられます。
- サーバーのOSを再インストールした(正常な原因)
- 中間者攻撃(MITM)が発生している(危険な原因)
正規のサーバー変更であることを確認した上で、古いホストキーを削除します。
# 特定ホストのホストキーを削除する
ssh-keygen -R 192.168.1.10
# 再接続してホストキーを再登録する
ssh [email protected]
不要な接続を許可しない設定
SSHのセキュリティ設定の詳細と推奨設定についてはこちらも参考になります。セキュリティを高めるためのsshd_config推奨設定をまとめます。
# /etc/ssh/sshd_config 推奨設定
Port 2222 # デフォルトの22番から変更
PermitRootLogin no # rootログインを禁止
PasswordAuthentication no # パスワード認証を無効化
PubkeyAuthentication yes # 公開鍵認証を有効化
MaxAuthTries 3 # 認証失敗の最大試行回数
LoginGraceTime 30 # ログイン猶予時間(秒)
AllowUsers user1 user2 # 接続を許可するユーザーを限定
SSHコマンドに関するよくある質問
SSH接続できない場合の原因と対処法
SSH接続トラブルの原因別対処法はこちらの記事で詳しく解説されています。また、Linuxコマンドに関する実践ガイドはkakiro-webでも発信しています。
| 症状 | 原因 | 対処法 |
|---|---|---|
| Connection refused | SSHサービスが停止中 | sudo systemctl start sshdで起動 |
| Connection timed out | ファイアウォールでポートがブロック | 22番(または設定ポート)の開放を確認 |
| Permission denied | パスワードまたは鍵が間違い | ユーザー名・パスワード・鍵ファイルを確認 |
| Host key verification failed | known_hostsのキーが古い | ssh-keygen -R ホスト名で削除して再接続 |
鍵認証とパスワード認証の違い
パスワード認証は覚えやすい反面、ブルートフォース攻撃に脆弱で、パスワード流出のリスクがあります。鍵認証は秘密鍵ファイルを持つ人だけが接続でき、数学的に解読が困難な暗号鍵を使うためセキュリティが格段に高く、公開サーバーには鍵認証の使用が必須です。
ポート番号を変更するメリット
デフォルトの22番ポートはインターネット上のボットが自動的にスキャンし、ブルートフォース攻撃を仕掛けてきます。2222番や49222番などの非標準ポートに変更することで、自動攻撃の大部分を回避できます。ただしポート変更は「隠蔽によるセキュリティ」であり、鍵認証の代替にはなりません。
WindowsやMacでのSSHクライアントの違い
| OS | SSHクライアント | 特徴 |
|---|---|---|
| Windows 10/11 | OpenSSH(標準搭載)・PowerShell | コマンドプロンプト・PowerShellからsshコマンドが使える |
| Windows(追加) | PuTTY・Tera Term・MobaXterm | GUI操作・セッション管理・マルチタブが可能 |
| Mac | OpenSSH(標準搭載) | ターミナルからそのままsshコマンドが使える |
| Linux | OpenSSH(標準搭載) | すべてのディストリビューションでデフォルト利用可能 |
まとめ
SSHコマンドは安全なリモート接続の基本ツール
SSHは暗号化通信によってリモートサーバーへの安全なアクセスを実現する、現代のサーバー管理に欠かせないツールです。基本構文のssh ユーザー名@ホスト名を起点に、~/.ssh/configによるサーバー管理・scpによるファイル転送・ポートフォワーディングまで、幅広い場面で活用できます。
鍵認証を利用することでセキュリティを向上可能
- 鍵ペアは
ssh-keygen -t ed25519で生成し、公開鍵をサーバーに登録する ~/.ssh/authorized_keysのパーミッションは600に設定する- パスワード認証は
sshd_configで無効化する - 秘密鍵にはパスフレーズを設定してローカルでも保護する
- 定期的に鍵ペアを更新して不要な公開鍵を削除する
オプションや応用機能を活用すれば、効率的かつ安全にリモート管理が可能
-vオプションによるデバッグ・-Lによるポートフォワーディング・~/.ssh/configによるサーバー管理の効率化など、SSHには基本接続の先に多くの応用機能があります。まずは鍵認証での接続を確実に習得し、次にconfigファイルの整備とセキュリティ設定の強化を進めることが、安全で効率的なリモートサーバー管理への最短ルートです。

