第7章 scp によるファイル転送
scp とは何か
scp(Secure Copy Protocol)は、SSH の暗号化通信を利用して、ネットワーク上の 2 台のコンピュータ間でファイルやディレクトリを安全にコピーするためのコマンドです。
従来の平文 FTP と異なり、認証パスワードやファイルの内容全体が暗号化されるため、機密ファイルや設定ファイルも安全に送受信できます。
構文は標準の cp(コピー)コマンドに非常に近く、直感的に操作できる特徴を持っています。
基本構文と主要オプション
scp の基本構造は「コピー元(source)」と「コピー先(destination)」の指定です。
scp [オプション] <コピー元> <コピー先>
リモートホストを指定する場合は <ユーザー名>@<ホスト名>:<パス> の形式で記述します。
主要オプション一覧
| オプション | 役割・説明 |
|---|---|
-r | ディレクトリ内を再帰的にすべてコピーする |
-p | 元ファイルの最終更新日時・アクセス日時・アクセス権限を保持する |
-P <ポート> | 接続先 SSH サーバのポート番号を指定する(大文字の P である点に注意) |
-i <秘密鍵> | 認証に使用する秘密鍵ファイルを明示的に指定する |
-v | 詳細なデバッグログを表示する |
▸ ポート番号指定オプションの注意点
通常の ssh コマンドではポート番号指定に小文字の -p を使いますが、scp では -p は属性保持(preserve)に割り当てられているため、ポート指定には 大文字の -P を使用します。
ファイル転送の実践操作
1. ローカルからリモートへアップロードする
手元のローカル PC にあるファイルを、リモートサーバの特定ディレクトリへ送信します。
# 単一ファイルのアップロード
scp app.tar.gz user@192.168.1.100:/var/www/
# ポート 2222 かつ秘密鍵を指定してアップロード
scp -P 2222 -i ~/.ssh/id_ed25519 app.tar.gz user@192.168.1.100:/var/www/
2. リモートからローカルへダウンロードする
リモートサーバ上にあるログファイルやバックアップを手元の作業 PC へ取得します。
# サーバ上のログファイルを手元カレントディレクトリ(.)にダウンロード
scp user@192.168.1.100:/var/log/nginx/access.log .
3. ディレクトリ全体の再帰コピー(-r)
フォルダ全体を丸ごと転送する場合は -r オプションを付与します。
# ローカルの dist フォルダ全体をサーバへ転送
scp -r ./dist user@192.168.1.100:/var/www/html/
.ssh/config のエイリアスを活用した効率的な転送
~/.ssh/config にホスト設定を記述しておくと、scp コマンドでもそのエイリアスがそのまま適用されます。
Host prod
HostName 203.0.113.10
User ubuntu
Port 2222
IdentityFile ~/.ssh/id_ed25519_prod
IdentitiesOnly yes
上記の設定が済んでいれば、ポート番号やユーザー名、秘密鍵の指定をすべて省略し、ローカルの cp コマンドと全く同じ感覚で簡潔に転送できます。
# 設定エイリアス prod を指定してアップロード
scp release.zip prod:/opt/app/
# 設定エイリアス prod から設定ファイルをダウンロード
scp prod:/opt/app/config.json ./
複雑な接続パラメータの入力ミスを防ぎ、日常のファイル転送作業を格段に安全・迅速に行うことができます。
近年の OpenSSH における scp の変化(SFTP ベース化)
歴史的に scp は古い rcp プロトコルをベースにしており、ワイルドカード展開やエスケープ処理に起因する脆弱性が指摘されていました。
これを受けて、OpenSSH 9.0 以降では、scp コマンドの内部実装が従来の SCP プロトコルから、より安全で現代的な SFTP(SSH File Transfer Protocol) を標準プロトコルとして使用するように刷新されました。
利用者は従来の scp のコマンド構文をそのまま使い続けながら、内部ではより厳格で安全なファイル転送プロトコルの保護を享受できます。