SSH接続コマンド完全ガイド|基本から高度な使い方まで徹底解説

プログラミング・IT

「サーバーに安全にリモート接続したい」
「FTPより安全にファイル転送する方法を知りたい」
「複数のサーバーを効率的に管理したい」

こんな時に必須となるのが「SSH(Secure Shell)」接続です。

SSHは、ネットワーク経由で他のコンピュータに安全に接続し、コマンドを実行したり、ファイルを転送したりできる強力なツールです。暗号化された通信により、パスワードやデータが盗聴される心配もありません。

でも「コマンドが覚えられない」「オプションが多すぎて分からない」「鍵認証の設定が難しそう」など、最初は戸惑うことも多いでしょう。

この記事では、SSH接続の基本的なコマンドから、便利なオプション、セキュアな鍵認証の設定、トンネリングなどの高度な使い方まで、初心者の方でも理解できるように詳しく解説していきます。

SSHを使いこなして、安全で効率的なリモート管理を実現しましょう!

スポンサーリンク

SSHの基礎知識

SSHとは何か

まずSSHの基本概念を理解しましょう。

SSH(Secure Shell)の特徴:

  • 暗号化された安全な通信
  • リモートでのコマンド実行
  • ファイル転送機能(SCP、SFTP)
  • ポート転送(トンネリング)
  • X11転送(GUI転送)

なぜSSHが必要なのか:

従来の接続方法(Telnet、FTP)の問題:
- パスワードが平文で送信される
- 通信内容が暗号化されない
- 中間者攻撃に脆弱

SSHの利点:
- すべての通信が暗号化
- 強力な認証方式
- データの完全性を保証

必要な環境

SSH接続に必要な環境を確認します。

クライアント側(接続する側):

  • Linux/Mac:標準でSSHクライアントがインストール済み
  • Windows:Windows 10以降は標準搭載、古い場合はPuTTY等が必要

サーバー側(接続される側):

  • SSHサーバー(OpenSSH等)がインストール・起動されている
  • ポート22(デフォルト)が開放されている
  • ユーザーアカウントが存在する

確認コマンド:

# SSHクライアントのバージョン確認
ssh -V

# SSHサーバーの状態確認(Linux)
sudo systemctl status sshd

# SSHサーバーの状態確認(Mac)
sudo systemsetup -getremotelogin

基本的なSSH接続コマンド

最も基本的な接続方法

SSHの基本的な接続コマンドを見ていきましょう。

基本構文:

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

実例:

# 最もシンプルな接続
ssh user@192.168.1.100

# ホスト名で接続
ssh user@example.com

# 現在のユーザー名で接続(ユーザー名省略)
ssh 192.168.1.100

# ポート番号を指定
ssh -p 2222 user@example.com

# IPv6アドレスで接続
ssh user@[2001:db8::1]

初回接続時の確認:

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

→ フィンガープリントを確認して「yes」を入力

よく使うオプション

頻繁に使用するSSHオプションです。

主要なオプション一覧:

# ポート指定
ssh -p 2222 user@host

# 秘密鍵を指定
ssh -i ~/.ssh/mykey.pem user@host

# 冗長モード(デバッグ情報表示)
ssh -v user@host      # 基本的な情報
ssh -vv user@host     # 詳細情報
ssh -vvv user@host    # 最も詳細

# X11転送を有効化(GUI転送)
ssh -X user@host      # 基本的なX11転送
ssh -Y user@host      # 信頼されたX11転送

# バックグラウンド実行
ssh -f user@host command

# 圧縮を有効化(低速回線で有効)
ssh -C user@host

# エージェント転送
ssh -A user@host

# 疑似端末を割り当てない
ssh -T user@host

# 強制的に疑似端末を割り当て
ssh -tt user@host

リモートコマンドの実行

接続せずに直接コマンドを実行する方法です。

単一コマンドの実行:

# ディスク使用状況を確認
ssh user@host "df -h"

# プロセスを確認
ssh user@host "ps aux | grep nginx"

# ファイル一覧を取得
ssh user@host "ls -la /var/log/"

# 複数コマンドを実行
ssh user@host "cd /var/www && ls -la && pwd"

スクリプトの実行:

# ローカルのスクリプトをリモートで実行
ssh user@host 'bash -s' < local_script.sh

# 引数付きでスクリプト実行
ssh user@host 'bash -s' -- arg1 arg2 < script.sh

# Pythonスクリプトの実行
ssh user@host python3 < script.py

出力のリダイレクト:

# リモートの結果をローカルファイルに保存
ssh user@host "cat /var/log/syslog" > local_log.txt

# リモートでコマンドを実行し、結果を圧縮して保存
ssh user@host "tar czf - /path/to/dir" > backup.tar.gz

SSH鍵認証の設定

鍵ペアの生成

パスワード認証より安全な鍵認証を設定しましょう。

鍵の生成コマンド:

# Ed25519鍵の生成(推奨)
ssh-keygen -t ed25519 -C "your_email@example.com"

# RSA鍵の生成(互換性重視)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 保存場所とパスフレーズの設定
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [パスフレーズ入力]
Enter same passphrase again: [パスフレーズ再入力]

生成される鍵ファイル:

~/.ssh/id_ed25519      # 秘密鍵(絶対に共有しない)
~/.ssh/id_ed25519.pub  # 公開鍵(サーバーに登録)

鍵の権限設定:

# 正しい権限に設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

公開鍵の登録

生成した公開鍵をサーバーに登録します。

方法1:ssh-copy-idを使用(推奨)

# 公開鍵を自動的にサーバーに転送
ssh-copy-id user@host

# 特定の鍵を指定
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host

# ポート指定
ssh-copy-id -p 2222 user@host

方法2:手動でコピー

# 公開鍵の内容を表示
cat ~/.ssh/id_ed25519.pub

# SSHで接続してauthorized_keysに追加
ssh user@host
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "公開鍵の内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

方法3:ワンライナーで追加

cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

SSH設定ファイル(config)

接続を簡単にする設定ファイルの活用です。

~/.ssh/configの作成:

# 設定ファイルを作成
touch ~/.ssh/config
chmod 600 ~/.ssh/config

設定例:

# 開発サーバー
Host dev
    HostName 192.168.1.100
    User developer
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# 本番サーバー(踏み台経由)
Host prod
    HostName 10.0.0.50
    User admin
    Port 2222
    ProxyJump bastion

# 踏み台サーバー
Host bastion
    HostName bastion.example.com
    User jump-user
    Port 22
    IdentityFile ~/.ssh/bastion_key

# 全ホスト共通設定
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    Compression yes
    TCPKeepAlive yes

使用方法:

# 設定したホスト名で簡単接続
ssh dev
ssh prod

ファイル転送(SCP/SFTP)

SCPコマンドでのファイル転送

SSHを使った安全なファイル転送方法です。

基本的なSCPコマンド:

# ローカルからリモートへ転送
scp local_file.txt user@host:/remote/path/

# リモートからローカルへ転送
scp user@host:/remote/file.txt /local/path/

# ディレクトリを再帰的に転送
scp -r local_dir/ user@host:/remote/path/

# ポート指定
scp -P 2222 file.txt user@host:/path/

# 進捗状況を表示しない(クーロンジョブ用)
scp -q file.txt user@host:/path/

# 圧縮して転送(大きなファイル用)
scp -C large_file.tar.gz user@host:/path/

複数ファイルの転送:

# ワイルドカードを使用
scp *.log user@host:/var/log/backup/

# 複数のファイルを指定
scp file1.txt file2.txt user@host:/path/

# リモート間でのコピー
scp user1@host1:/file.txt user2@host2:/path/

SFTPの使い方

対話的なファイル転送を行うSFTPの使用方法です。

SFTP接続と基本操作:

# SFTP接続
sftp user@host

# ポート指定
sftp -P 2222 user@host

SFTPコマンド一覧:

# リモート側の操作
ls              # ファイル一覧表示
cd /path        # ディレクトリ移動
pwd             # 現在のディレクトリ表示
mkdir dirname   # ディレクトリ作成
rm filename     # ファイル削除
rmdir dirname   # ディレクトリ削除

# ローカル側の操作
lls             # ローカルファイル一覧
lcd /path       # ローカルディレクトリ移動
lpwd            # ローカルの現在ディレクトリ

# ファイル転送
get remote.txt              # ダウンロード
get -r remote_dir/          # ディレクトリをダウンロード
put local.txt               # アップロード
put -r local_dir/           # ディレクトリをアップロード
mget *.txt                  # 複数ファイルをダウンロード
mput *.log                  # 複数ファイルをアップロード

# その他
help            # ヘルプ表示
exit/quit       # 終了

バッチモードでの実行:

# コマンドファイルを作成
cat > sftp_batch.txt << EOF
cd /var/backup
get backup.tar.gz
exit
EOF

# バッチ実行
sftp -b sftp_batch.txt user@host

SSHトンネリング(ポート転送)

ローカルポート転送

リモートのサービスをローカルで使用する方法です。

基本構文:

ssh -L [ローカルポート]:[転送先ホスト]:[転送先ポート] [SSHサーバー]

実用例:

# リモートのMySQLに接続
ssh -L 3307:localhost:3306 user@dbserver
# 接続方法:mysql -h localhost -P 3307

# リモートのWebサービスにアクセス
ssh -L 8080:localhost:80 user@webserver
# ブラウザで:http://localhost:8080

# 別のサーバーのサービスに転送
ssh -L 5433:db.internal:5432 user@gateway
# gateway経由でdb.internalのPostgreSQLに接続

# バックグラウンドで実行
ssh -fN -L 8888:localhost:8888 user@host

リモートポート転送

ローカルのサービスをリモートに公開する方法です。

基本構文:

ssh -R [リモートポート]:[転送先ホスト]:[転送先ポート] [SSHサーバー]

実用例:

# ローカルのWebサーバーをリモートに公開
ssh -R 8080:localhost:3000 user@server
# リモートで:curl http://localhost:8080

# 外部からアクセス可能にする(要設定)
ssh -R 0.0.0.0:8080:localhost:3000 user@server

# 複数のポート転送
ssh -R 8080:localhost:3000 -R 8081:localhost:3001 user@server

動的ポート転送(SOCKSプロキシ)

SSH経由ですべての通信を転送する方法です。

# SOCKSプロキシを作成
ssh -D 8888 user@server

# バックグラウンドで実行
ssh -fN -D 8888 user@server

# 圧縮も有効化(低速回線用)
ssh -CfN -D 8888 user@server

ブラウザでの使用:

プロキシ設定:
- タイプ:SOCKS5
- ホスト:localhost
- ポート:8888

コマンドラインでの使用:

# curlでSOCKSプロキシを使用
curl --proxy socks5://localhost:8888 https://example.com

# gitでSOCKSプロキシを使用
git config --global http.proxy socks5://localhost:8888

多段SSH(踏み台経由)

ProxyJumpを使った接続

踏み台サーバー経由での接続方法です。

コマンドラインでの指定:

# 単一の踏み台経由
ssh -J bastion@jump.example.com user@target.internal

# 複数の踏み台経由
ssh -J user1@jump1,user2@jump2 user@target

# ポート指定
ssh -J bastion@jump.example.com:2222 user@target

設定ファイルでの指定:

# ~/.ssh/config
Host target
    HostName target.internal
    User targetuser
    ProxyJump bastion

Host bastion
    HostName jump.example.com
    User jumpuser
    Port 22

ProxyCommandを使った接続

より柔軟な踏み台接続の設定です。

# ~/.ssh/config
Host target
    HostName target.internal
    User targetuser
    ProxyCommand ssh bastion nc %h %p

# socatを使用
Host target
    ProxyCommand ssh bastion socat - TCP:%h:%p

# 複数踏み台
Host target
    ProxyCommand ssh -q -W %h:%p jump2

Host jump2
    ProxyCommand ssh -q -W %h:%p jump1

Host jump1
    HostName jump1.example.com

SSHエージェント

ssh-agentの使い方

パスフレーズの入力を省略する方法です。

エージェントの起動と鍵の追加:

# エージェントを起動
eval $(ssh-agent)

# 鍵を追加
ssh-add ~/.ssh/id_ed25519

# パスフレーズを入力
Enter passphrase for ~/.ssh/id_ed25519:

# 登録された鍵を確認
ssh-add -l

# すべての鍵を削除
ssh-add -D

# 特定の鍵を削除
ssh-add -d ~/.ssh/id_ed25519

自動起動の設定(.bashrc/.zshrc):

# SSH Agent自動起動
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval $(ssh-agent)
    ssh-add ~/.ssh/id_ed25519
fi

エージェント転送

踏み台経由でも鍵を使えるようにする設定です。

# エージェント転送を有効にして接続
ssh -A user@bastion

# 設定ファイルで指定
Host bastion
    ForwardAgent yes

セキュリティ上の注意:

  • 信頼できるサーバーでのみ使用
  • 踏み台サーバーの管理者は鍵を使用可能
  • 必要最小限の使用に留める

セキュリティ設定

SSHサーバーの設定強化

サーバー側のセキュリティを高める設定です。

/etc/ssh/sshd_configの推奨設定:

# ポート変更
Port 2222

# rootログインを禁止
PermitRootLogin no

# パスワード認証を無効化
PasswordAuthentication no

# 公開鍵認証のみ許可
PubkeyAuthentication yes

# 空パスワードを禁止
PermitEmptyPasswords no

# ログインできるユーザーを制限
AllowUsers user1 user2

# X11転送を無効化(不要な場合)
X11Forwarding no

# 接続試行回数の制限
MaxAuthTries 3

# 同時接続数の制限
MaxSessions 10

設定の反映:

# 設定ファイルのテスト
sudo sshd -t

# SSHサービスの再起動
sudo systemctl restart sshd

fail2banによる攻撃対策

総当たり攻撃を防ぐツールの設定です。

# インストール(Ubuntu/Debian)
sudo apt install fail2ban

# 設定ファイルの作成
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# SSH用の設定

[sshd]

enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600

トラブルシューティング

接続できない時の確認事項

SSH接続が失敗する場合のチェックリストです。

基本的な確認:

# ネットワーク疎通確認
ping hostname

# ポートが開いているか確認
nc -zv hostname 22
telnet hostname 22
nmap -p 22 hostname

# DNS解決の確認
nslookup hostname
dig hostname

# ルーティングの確認
traceroute hostname

詳細なデバッグ:

# 冗長モードで接続
ssh -vvv user@host

# 特定の認証方法を試す
ssh -o PreferredAuthentications=password user@host
ssh -o PreferredAuthentications=publickey user@host

# 設定ファイルを無視して接続
ssh -F /dev/null user@host

# known_hostsを無視
ssh -o StrictHostKeyChecking=no user@host

よくあるエラーと対処法

Permission denied (publickey)

# 原因:鍵認証が失敗
# 対処法:
1. 正しい鍵を指定
ssh -i ~/.ssh/correct_key user@host

2. 鍵の権限を確認
chmod 600 ~/.ssh/id_*
chmod 700 ~/.ssh

3. authorized_keysの権限を確認
chmod 600 ~/.ssh/authorized_keys

Connection refused

# 原因:SSHサービスが起動していない、ファイアウォール
# 対処法:
1. SSHサービスの確認
sudo systemctl status sshd
sudo systemctl start sshd

2. ファイアウォールの確認
sudo ufw status
sudo iptables -L

Host key verification failed

# 原因:ホスト鍵が変更された
# 対処法:
1. known_hostsから古い鍵を削除
ssh-keygen -R hostname

2. または該当行を手動削除
vim ~/.ssh/known_hosts

よくある質問

Q: タイムアウトを防ぐには?

A: ServerAliveIntervalを設定します。

# コマンドラインで指定
ssh -o ServerAliveInterval=60 user@host

# 設定ファイルで指定
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

Q: パスワードなしで接続するには?

A: 鍵認証を設定します。

# 鍵生成
ssh-keygen -t ed25519

# 公開鍵をサーバーに転送
ssh-copy-id user@host

ただし、セキュリティのためパスフレーズは設定することを推奨します。

Q: 複数の鍵を使い分けるには?

A: IdentityFileで指定するか、ssh-agentを使用します。

# コマンドラインで指定
ssh -i ~/.ssh/specific_key user@host

# 設定ファイルで指定
Host server1
    IdentityFile ~/.ssh/key1

Host server2
    IdentityFile ~/.ssh/key2

Q: SSHのバージョンを確認するには?

A: 以下のコマンドを使用します。

# クライアントのバージョン
ssh -V

# サーバーのバージョン
ssh user@host "ssh -V"

Q: 接続を高速化するには?

A: 以下の設定を試してください。

# ~/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/control-%C
    ControlPersist 10m
    Compression yes
    TCPKeepAlive yes

まとめ

SSH接続は、適切に設定すれば非常に強力で安全なツールです。

重要なポイント:

  1. 基本をマスター
  • 基本的な接続コマンド
  • よく使うオプション
  • リモートコマンド実行
  1. セキュリティを重視
  • 鍵認証の使用
  • パスフレーズの設定
  • ポート変更などの強化
  1. 効率化の工夫
  • configファイルの活用
  • ssh-agentの利用
  • エイリアスの設定
  1. 高度な機能の活用
  • ポート転送
  • 多段SSH
  • SOCKSプロキシ
  1. トラブル対応
  • デバッグモードの活用
  • ログの確認
  • 適切なエラー対処

SSHは、サーバー管理やリモート作業に欠かせないツールです。

この記事で紹介したコマンドとテクニックを活用して、安全で効率的なリモート環境を構築してください。コマンドラインの力を最大限に活用しましょう!

コメント

タイトルとURLをコピーしました