【Linux】sshコマンドの使い方と鍵認証設定|ssh-keygen作成・~/.ssh/config設定・リモートコマンド実行完全ガイド

コマンドリファレンス実務レシピ

リモートのLinuxサーバーやクラウド環境(VPS、AWS EC2、GCP等)を管理・運用する際、最も頻繁に使用するコマンドが ssh(Secure Shell)です。日々の開発やインフラ運用において、手作業で毎回長い接続コマンドを入力したり、パスワード入力に手間取ったりするのは非効率であり、まさに「手作業は負け」です。

ssh コマンドを使いこなせば、パスワードレスの安全な公開鍵認証~/.ssh/config による接続コマンドの極小化(エイリアス接続)、さらには リモートサーバーでのワンライナー自動実行 まで、実務のあらゆる作業をスマートに自動化できます。

本記事では、ssh コマンドの基本構文と主要オプション早見表から、安全な ssh-keygen(ed25519)による鍵認証の設定手順、業務効率を劇的に高める ~/.ssh/config の設定テンプレート、スクリプト自動化の連携パターン、そして現場で直面する Host key verification failed 等のエラー対処法まで徹底解説します。

【結論】コピペで動く!ssh接続コマンド一覧&主要オプション早見表

  • 基本接続: ssh user@hostname (ポート22・デフォルト鍵で接続)
  • 秘密鍵を指定して接続: ssh -i ~/.ssh/my_key user@hostname
  • ポート番号を指定して接続: ssh -p 2222 user@hostname
  • 詳細デバッグログを出力(接続トラブル切り分け): ssh -v user@hostname (最大 -vvv
  • リモートサーバーでコマンドを直接実行: ssh user@hostname "uname -a && uptime"
  • 踏み台経由で多段接続: ssh -J jumpuser@jumphost targetuser@targethost
  • 設定ファイル(config)で一発接続: ssh myserver (ユーザー・ホスト・鍵・ポートを自動適用)

sshコマンドの基本構文と主要オプション早見表

ssh コマンドは、クライアントとサーバー間の全通信(認証情報や送受信データ)を暗号化し、遠隔マシンに安全にログインまたはコマンド実行するためのツールです。まずは最短で接続するための基本構文と実務で頻出する主要オプションを押さえましょう。

# ssh コマンドの基本構文
ssh [オプション] [ユーザー名@]ホスト名 [リモート実行コマンド]
  • ユーザー名: 接続先サーバーに存在するログインユーザー名。省略した場合、ローカルPCの現在のログインユーザー名が適用されます。
  • ホスト名: 接続先サーバーのIPアドレス(例: 192.168.1.100)またはドメイン名(例: example.com)。
  • リモート実行コマンド: 接続後にサーバー側で実行させたいコマンド。指定した場合はコマンドの実行結果を標準出力に受け取り、セッションは自動で切断されます。

基本接続: ssh [ユーザー名]@[ホスト名/IPアドレス]

最も標準的な接続方法は、ユーザー名とホスト名を @ で繋ぐ形式です。

# IPアドレスを指定してログイン
ssh ubuntu@192.168.1.50

# ドメイン名(FQDN)を指定してログイン
ssh webmaster@example.com

初めて接続するサーバーの場合、以下のような「ホスト鍵の真正性確認メッセージ」が表示されます:

The authenticity of host '192.168.1.50 (192.168.1.50)' can't be established.
ED25519 key fingerprint is SHA256:abc123xyz456...
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

これは接続先が意図した本物のサーバーであるかを確認するOpenSSHの保護機能です。yes と入力して Enter を押すと、接続先サーバーの公開鍵フィンガープリントがローカルの ~/.ssh/known_hosts に記録され、次回以降はこの確認プロンプトが表示されなくなります。

主要オプション(-i 秘密鍵, -p ポート, -v デバッグ, -C 圧縮, -N ポートフォワード)早見表

実務の現場では、セキュリティ強化のためにSSHポートを22番から変更していたり、特定の秘密鍵ファイルを明示指定する必要があるケースが多々あります。以下のオプション早見表をブックマークしておくと便利です。

オプション 機能・用途 実用コマンド例
-i <identity_file> 秘密鍵ファイルを明示指定
デフォルト(~/.ssh/id_rsa等)以外の鍵を使用する場合に指定
ssh -i ~/.ssh/my_project.key user@host
-p <port> 接続先ポート番号を指定
デフォルトの22番以外で待ち受けているサーバーへ接続
ssh -p 2222 user@host
-v / -vv / -vvv デバッグログの詳細表示
認証失敗や接続切断の原因を究明する際に必須(vが増えるほど詳細)
ssh -vv -i ~/.ssh/id_ed25519 user@host
-C 通信データの圧縮
回線速度が遅い環境や、大量のテキストログを受信する際に高速化
ssh -C user@host "cat /var/log/syslog"
-N リモートコマンドを実行しない
ポートフォワーディング(トンネル開設)専用で接続を維持
ssh -N -L 8080:localhost:80 user@host
-t 疑似端末(pseudo-terminal)の強制割り当て
SSH越しにsudoや対話型プログラム(vim, top等)を動かす際に必須
ssh -t user@host "sudo systemctl restart nginx"
-J <jumphost> 踏み台サーバー(Jump Host)経由で接続
プライベートNW内のサーバーへ中間踏み台経由でワンライナー接続
ssh -J bastion@bastion.example.com appuser@10.0.1.5
-o <option=val> SSH設定を個別指定
StrictHostKeyCheckingやConnectTimeoutをワンタイムで設定
ssh -o ConnectTimeout=5 -o BatchMode=yes user@host

公開鍵認証(パスワードレス接続)の完全手順

初期状態のサーバーで使われる「パスワード認証」は、キーロガーによるパスワード漏洩や、外部からの総当たり攻撃(ブルートフォース攻撃)に晒されるリスクがあります。実務のインフラ運用では、公開鍵認証(Public Key Authentication) を導入し、パスワード認証を無効化するのが基本原則です。

1. ssh-keygenで安全な鍵ペアを作成する(ed25519推奨)

以前は暗号アルゴリズムとして RSA(4096bit等)が広く使われていましたが、現在のデファクトスタンダードは Ed25519(EdDSA署名アルゴリズム)です。Ed25519 は RSA に比べて処理速度が圧倒的に高速であり、暗号強度が極めて高く、公開鍵・秘密鍵のサイズがコンパクトという優れた特徴を持っています。

# Ed25519アルゴリズムで鍵ペアを生成(推奨)
ssh-keygen -t ed25519 -C "admin@example.com" -f ~/.ssh/id_ed25519_production

コマンドの引数は以下の通りです:

  • -t ed25519: 暗号化方式に Ed25519 を指定(レガシー環境で非対応の場合は -t rsa -b 4096)。
  • -C "コメント": 鍵の識別用コメント(メールアドレスや用途などを記載)。
  • -f <出力パス>: 鍵ファイルの保存先。未指定時はデフォルトの ~/.ssh/id_ed25519 に保存されます。

コマンドを実行すると、パスフレーズの入力が求められます:

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

手動接続用の鍵であれば、万一の秘密鍵流出に備えて強固なパスフレーズを設定するのが推奨です。一方、後述するバッチ処理やcronによる夜間自動同期など、完全自動化スクリプトで使う鍵の場合はパスフレーズを空(そのまま Enter を2回押す)にして作成します。

生成後、~/.ssh/ ディレクトリには以下の2つのファイルが作成されます:

  • ~/.ssh/id_ed25519_production(秘密鍵): 絶対に他人に渡してはならない鍵。ローカルPCにのみ安全に保管します。
  • ~/.ssh/id_ed25519_production.pub(公開鍵): 接続先サーバーに登録するための鍵。外部に知られても安全です。

2. サーバー側(authorized_keys)に公開鍵を登録する(ssh-copy-id)

作成した公開鍵(.pub)を接続先サーバーの ~/.ssh/authorized_keys に転送・登録します。最も安全かつ手軽な方法は ssh-copy-id コマンドを使うことです。

# ssh-copy-id で公開鍵をサーバーへ転送登録
ssh-copy-id -i ~/.ssh/id_ed25519_production.pub user@example.com

# ポート番号が変更されているサーバーの場合(-p オプション指定)
ssh-copy-id -i ~/.ssh/id_ed25519_production.pub -p 2222 user@example.com

ssh-copy-id は、サーバー側に ~/.ssh ディレクトリが存在しなければ適切な権限で自動作成し、authorized_keys に公開鍵を重複なく追記してくれます。

もし macOS や特殊な環境で ssh-copy-id がインストールされていない場合は、以下のパイプラインワンライナーで安全に手動登録できます:

# ssh-copy-id が使えない場合の代替ワンライナー
cat ~/.ssh/id_ed25519_production.pub | ssh -p 22 user@example.com "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

⚠️ 注意: リダイレクト演算子は「>>」(追記)を使うこと

authorized_keys に登録する際、誤って単一の > を使うと既存の鍵がすべて上書き消去され、既存ユーザーがログインできなくなる重大インシデントにつながります。必ず >> で追記してください。

3. 権限設定(.sshディレクトリは700、秘密鍵は600)の必須ルール

OpenSSHには厳格なセキュリティチェックが組み込まれており、鍵ファイルや関連ディレクトリのパーミッションが「グループや他ユーザーから読み書き可能」になっていると、セキュリティ保護のため 強制的に接続を拒絶(エラー) します。

以下のパーミッション表は、Linuxエンジニアが暗記しておくべき鉄則ルールです:

対象(配置先) 推奨パーミッション 記号表記 設定コマンド
ローカルの秘密鍵
~/.ssh/id_ed25519
600
(所有者のみ読み書き可)
-rw------- chmod 600 ~/.ssh/id_ed25519
ローカルの公開鍵
~/.ssh/id_ed25519.pub
644
(全員読み取り可)
-rw-r--r-- chmod 644 ~/.ssh/id_ed25519.pub
ローカル / サーバーの .ssh
~/.ssh/
700
(所有者のみフルアクセス)
drwx------ chmod 700 ~/.ssh
サーバー側 authorized_keys
~/.ssh/authorized_keys
600
(所有者のみ読み書き可)
-rw------- chmod 600 ~/.ssh/authorized_keys
ローカルの config ファイル
~/.ssh/config
600
(所有者のみ読み書き可)
-rw------- chmod 600 ~/.ssh/config

もしパーミッションが 644777 のまま接続を試みると、以下のような致命的エラーが発生して接続が中断されます:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/user/.ssh/id_ed25519": bad permissions
user@example.com: Permission denied (publickey).

このエラーが出た場合は、迷わず chmod 600 ~/.ssh/id_ed25519 を実行してパーミッションを修正してください。権限設定の仕組みや数値計算の詳細については、【Linux】chmodコマンドの使い方とパーミッション設定 もあわせてご参照ください。

実務が劇的に楽になる「~/.ssh/config」の設定例

公開鍵認証が設定できたとしても、接続するたびに毎回以下のように長いコマンドを打ち込むのは苦痛ですし、タイポの原因になります:

# 毎回これを手入力するのは「手作業の負け」
$ ssh -i ~/.ssh/id_ed25519_production -p 2222 appadmin@203.0.113.85

クライアント側の設定ファイル ~/.ssh/config を1度作成しておけば、ssh myserver と打つだけで、ホスト名・ユーザー名・ポート番号・秘密鍵のパスがすべて自動適用されます。

ホスト名・ユーザー・ポート・秘密鍵をまとめた設定テンプレート

~/.ssh/config ファイルが存在しない場合は新規作成し、以下のテンプレートを参考に環境別の設定を記述します。

# ~/.ssh/config の権限を安全に設定して開く
touch ~/.ssh/config && chmod 600 ~/.ssh/config
vim ~/.ssh/config
# ==========================================
# 全ホスト共通のデフォルト設定
# ==========================================
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    IdentitiesOnly yes

# ==========================================
# 本番環境(Production Web Server)
# ==========================================
Host prod-web
    HostName 203.0.113.85
    User appadmin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_production

# ==========================================
# ステージング環境(Staging App Server)
# ==========================================
Host stg-app
    HostName stg.example.com
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519_staging

# ==========================================
# 踏み台経由でアクセスするプライベートDBサーバー
# ==========================================
Host prod-db
    HostName 10.0.2.15
    User postgres
    Port 5432
    ProxyJump prod-web
    IdentityFile ~/.ssh/id_ed25519_db

設定項目の要点は以下の通りです:

  • Host <接続エイリアス名>: 接続時に指定する自由なショートカット名。
  • HostName: 実際のIPアドレスまたは完全修飾ドメイン名(FQDN)。
  • User: ログインするリモートユーザー名。
  • Port: SSHサーバーのポート番号(デフォルトの22番なら省略可)。
  • IdentityFile: 認証に使用する秘密鍵の絶対パス。
  • ServerAliveInterval 60: 60秒ごとにキープアライブパケットを送信し、通信無通信によるセッション切断を防ぐ設定。
  • IdentitiesOnly yes: 指定した秘密鍵のみを使用する(ssh-agentが持つ多数の鍵を順に試して認証失敗するのを防ぐ)。
  • ProxyJump <踏み台Host名>: 踏み台サーバーを経由して内部ネットワークのサーバーへワンライナーで安全に多段SSH接続する設定。

コマンド一発(ssh myserver)で接続できるようにする設定

上記の設定を保存したら、あとは端末でエイリアス名を指定するだけで瞬時にログインできます:

# 一発で本番サーバーにログイン
$ ssh prod-web

# 踏み台経由のDBサーバーにも一発でログイン
$ ssh prod-db

さらに強力な点として、~/.ssh/config の設定は ssh コマンドだけでなく、scprsyncgit コマンドでもそのまま利用可能 です:

# rsync でファイルを同期する際もエイリアス名が使える
rsync -avz --delete ./dist/ prod-web:/var/www/html/

# scp でリモートからログファイルをダウンロード
scp prod-web:/var/log/nginx/access.log ./local_logs/

設定ファイルの書き方やさらに高度なProxyCommandの応用例については、SSH configの書き方|~/.ssh/configで接続設定をまとめる方法 でも詳しく解説しています。

実務自動化・スクリプト連携パターン

ssh コマンドの真価は、対話的なログイン操作にとどまらず、シェルスクリプトやcron、CI/CDパイプラインと連携させた「リモートタスクの自動化」 にあります。

SSH越しにリモートでコマンドを実行する(ssh user@host “command”)

ホスト名に続けてダブルクォートで囲んだコマンドを渡すと、SSH接続先でそのコマンドを実行し、結果をローカルの標準出力に返して即座に終了します。

# サーバーのディスク使用量とメモリ残量を手元で確認
ssh prod-web "df -h / && free -m"

# サーバーのNginxサービス状態を確認
ssh prod-web "systemctl is-active nginx"

複数行のスクリプトを手元のローカルPCからリモートサーバーへ一括送信して実行させたい場合は、ヒアドキュメント(Here Document) を活用するのが最もエレガントです:

#!/usr/bin/env bash
# ローカルスクリプトからリモート環境を一括メンテナンス
set -euo pipefail

TARGET_HOST="prod-web"

echo "=== [${TARGET_HOST}] リモートメンテナンス開始 ==="
ssh -T "${TARGET_HOST}" << 'REMOTE_SCRIPT'
    set -euo pipefail
    echo "1. パッケージ更新チェック..."
    sudo apt-get update -qq

    echo "2. 一時ファイルのクリーンアップ..."
    sudo rm -rf /tmp/cache_*

    echo "3. アプリケーション再起動..."
    sudo systemctl reload app.service
    echo "メンテナンス完了"
REMOTE_SCRIPT
echo "=== 全行程が正常終了しました ==="

ここで << 'REMOTE_SCRIPT' とクォートで囲むのが重要です。クォートを付けることで、スクリプト内の変数($VAR)がローカル側で誤って事前展開されるのを防ぎ、リモート環境のシェル上でそのまま実行させることができます。

対話入力を回避してスクリプトで自動実行する際の注意点

シェルスクリプトやCI/CDジョブの中で ssh を実行する際、パスワード入力プロンプトやホスト鍵確認で処理が止まってしまう(ハングアップする)事故がよく発生します。これを回避するための必須オプションをマスターしておきましょう。

# 自動化バッチで必須の非対話実行テンプレート
ssh -o BatchMode=yes 
    -o ConnectTimeout=10 
    -o StrictHostKeyChecking=accept-new 
    prod-web "bash /opt/scripts/nightly-backup.sh"
  • -o BatchMode=yes: パスフレーズやパスワードの対話プロンプトを一切出さず、鍵認証が通らない場合は即座に非ゼロの終了ステータスで失敗させます。バッチのハング防止に必須です。
  • -o ConnectTimeout=10: サーバーがダウンしている場合に指定秒数(10秒)でタイムアウトさせ、スクリプト全体の停滞を防ぎます。
  • -o StrictHostKeyChecking=accept-new: 初回接続の未知のホスト鍵は自動で known_hosts に追加し、鍵が変更されている場合のみ拒絶します(OpenSSH 7.6以降)。
  • -t オプション(sudo実行時): リモートで sudo を実行する際、「sudo: a terminal is required to read the password」と怒られる場合は、ssh -t prod-web "sudo ..." として疑似端末を強制割り当てします。

Host key verification failed エラーの対処法(ssh-keygen -R)

クラウド環境でサーバーを再作成(OS再インストール)したり、IPアドレスを再利用した直後、SSH接続しようとすると突然以下の警告画面に遭遇することがあります:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:7u8v9w0x...
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/user/.ssh/known_hosts:42
Host key verification failed.

このエラーは、ローカルの known_hosts に保存されている過去のホスト鍵と、サーバーから送られてきた現在のホスト鍵が一致しないために発生します。中間者攻撃(MITM)を防ぐためのセキュリティ機構ですが、サーバー再構築が理由だと分かっている場合は古い鍵レコードを更新する必要があります。

ここで絶対にやってはいけないのは、rm ~/.ssh/known_hosts でファイル全体を削除すること です。他の安全なサーバーの登録鍵まで失われてしまい、セキュリティリスクに晒されます。

正しい対処法は、ssh-keygen -R コマンドを使って、対象ホストのレコードだけをピンポイントで削除することです:

# ホスト名またはIPアドレスを指定して古いホスト鍵を削除
ssh-keygen -R 203.0.113.85

# ドメイン名の場合
ssh-keygen -R example.com

# 非標準ポート(例: 2222)を指定している場合
ssh-keygen -R "[example.com]:2222"

削除が成功すると、known_hosts.old にバックアップが作成され、次回接続時に新しいホスト鍵を安全に登録できるようになります。

まとめ & 関連記事

Linux環境における ssh コマンドは、サーバー遠隔管理の土台となる最重要インフラツールです。本記事のポイントをまとめます:

  • 公開鍵認証の徹底: 安全・高速な Ed25519 アルゴリズムで鍵ペアを作成し、ssh-copy-id でサーバーに配置する。
  • 厳格な権限管理: .ssh ディレクトリは 700、秘密鍵ファイルは 600 に設定しなければ OpenSSH は動作を拒否する。
  • ~/.ssh/config の活用: 接続情報をテンプレート化し、ssh myserver の一発接続で入力の手間とタイポをゼロにする。
  • 自動化スクリプト連携: BatchMode=yes やヒアドキュメントを活用し、CI/CDや定期メンテナンスの完全自動化を実現する。

手動でのコマンド入力やパスワード管理から脱却し、シンプルで堅牢なSSH運用を構築しましょう。

あわせて読みたい関連記事

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント