はじめに

こんにちは!今回はscpコマンドについて解説します。

scpはSSH経由で安全にファイルを転送するコマンド。ローカル↔リモート、さらにはリモート↔リモート間のファイル転送ができます。

cpのSSH版ってイメージですね。セキュアでシンプルだから、ファイル転送の定番です。

scpコマンドとは

scpは"Secure Copy"の略で、SSHプロトコルを使用して安全にファイルを転送する外部コマンドです。

昔のrcp(Remote Copy)と違い、通信内容が暗号化されます。リモートサーバーとのファイル転送、バックアップ、設定ファイルの配置など、様々な場面で活躍します。

基本構文

1
scp [オプション] コピー元 コピー先

ローカルファイルは通常のパス、リモートファイルはuser@host:path形式で指定します。

主なオプション

オプション 説明
-r ディレクトリを再帰的にコピー
-p ファイルの属性(タイムスタンプ・権限)を保持
-P ポート番号を指定(大文字)
-C 圧縮を有効にする
-v 詳細表示(verbose)
-i 秘密鍵ファイルを指定
-o SSHオプション設定
-3 2つのリモートホスト間でコピー(経由ホストを明示)

使用例

例1: ローカルからリモートにファイルをコピー

1
scp file.txt [email protected]:/home/user/

実行結果:

1
2
[email protected]'s password:
file.txt                                      100%  1024     1.0MB/s   00:00

ローカルのfile.txtをリモートホストの/home/user/にコピーします。進捗バーが表示されます。

例2: リモートからローカルにファイルをコピー

1
scp [email protected]:/var/log/app.log ./

実行結果:

1
2
[email protected]'s password:
app.log                                       100%   2048     2.0MB/s   00:00

リモートホストの/var/log/app.logをローカルの現在ディレクトリにコピーします。

例3: リモートからリモートにファイルをコピー

1
scp [email protected]:/data/file.tar.gz [email protected]:/backup/

実行結果:

1
2
3
[email protected]'s password:
[email protected]'s password:
file.tar.gz                                   100%  5120MB   5.0MB/s  00:17

2つのリモートホスト間でファイルを転送。ローカルマシンを経由して転送されます。

例4: ディレクトリ全体をコピー(再帰的)

1
scp -r [email protected]:/home/user/project ./

実行結果:

1
2
3
[email protected]'s password:
config.json                                   100%   512     0.5MB/s   00:00
app.js                                        100%   2048     2.0MB/s   00:00

リモートディレクトリをローカルにコピー。ディレクトリ構造は保持されます。

例5: ファイル属性を保持してコピー

1
scp -p [email protected]:/etc/myapp.conf ./

実行結果:

1
2
[email protected]'s password:
myapp.conf                                    100%   256     0.3MB/s   00:00

-pオプションでタイムスタンプと権限を保持。バックアップ用途に便利です。

例6: 非標準ポートを使用

1
scp -P 2222 file.txt [email protected]:/home/user/

実行結果:

1
2
[email protected]'s password:
file.txt                                      100%  1024     1.0MB/s   00:00

SSHがポート2222で動作している場合に使用します。注意:-Pは大文字です。

例7: 秘密鍵を指定してコピー

1
scp -i ~/.ssh/id_rsa file.txt [email protected]:/home/user/

実行結果:

1
file.txt                                      100%  1024     1.0MB/s   00:00

秘密鍵ベースの認証を使用。パスワード入力なしでコピーできます。

例8: 複数ファイルをコピー

1
scp file1.txt file2.txt file3.txt [email protected]:/home/user/

実行結果:

1
2
3
4
[email protected]'s password:
file1.txt                                     100%   512     0.5MB/s   00:00
file2.txt                                     100%   768     0.7MB/s   00:00
file3.txt                                     100%   1024     1.0MB/s   00:00

複数ファイルをまとめてコピー。各ファイルの進捗が表示されます。

例9: ワイルドカードを使用(ローカル → リモート)

1
scp *.log [email protected]:/var/log/

実行結果:

1
2
3
[email protected]'s password:
access.log                                    100%   4096     4.0MB/s   00:00
error.log                                     100%   2048     2.0MB/s   00:00

*.logにマッチするすべてのファイルをコピー。

例10: 圧縮転送で遅い接続を高速化

1
scp -C -r [email protected]:/home/user/largedir ./

実行結果:

1
2
3
[email protected]'s password:
file1.txt                                     100%   512     0.8MB/s   00:00
file2.txt                                     100%  1024     1.5MB/s   00:00

-Cオプションで転送を圧縮。特に遅いネットワークで効果的です。

Tips・注意点

ポート番号は大文字の-Pを使う

-pは属性保持、-Pはポート番号指定という別の機能です。混同しないように注意。

1
scp -P 2222 -p file.txt [email protected]:/home/user/

両方使う場合は上記のように組み合わせます。

リモート→リモート転送のパスワード入力

リモート→リモート転送時は両ホストのパスワードが求められます。秘密鍵認証の設定があると便利です。

ワイルドカードはローカル側でのみ展開

1
2
3
4
5
# これはNG(シェルがリモートパスを展開しようとする)
scp [email protected]:~/*.txt ./

# これはOK(ローカルのシェルが展開)
scp *.txt [email protected]:~/

リモート側のワイルドカードを使う場合はコマンド実行で対応:

1
ssh [email protected] "tar czf - *.txt" > files.tar.gz

大きなディレクトリはcompressオプションで時間短縮

1
scp -C -r [email protected]:/home/user/bigdata ./

ネットワーク帯域幅が限られている場合、圧縮が有効です。

実践的な使い方

例1: サーバーのバックアップを定期的に取得

1
scp -p [email protected]:/var/www/html/config.php ./backups/config.php.$(date +%Y%m%d)

日付付きファイル名でバックアップを自動取得。cronに組み込めます。

例2: ローカルのログファイルを中央サーバーに集約

1
scp /var/log/app.log [email protected]:/var/logs/server1/

複数サーバーのログを中央管理サーバーに集約。スクリプト内で活用します。

例3: デプロイ用に複数ファイルを転送

1
scp -r ./build/* [email protected]:/var/www/html/

ビルド結果をデプロイサーバーに一括転送。CI/CDパイプラインに組み込めます。

例4: リモート間でのデータベースダンプ転送

1
scp -C [email protected]:/backup/dump.sql [email protected]:/backups/

圧縮してデータベースダンプを転送。ストレージスペース節約に効果的。

まとめ

scpコマンドのポイント:

  • SSHプロトコルを使用した安全なファイル転送
  • 基本形: scp file user@host:path
  • リモート→ローカル: scp user@host:path ./
  • リモート→リモート: scp user1@host1:path user2@host2:path
  • 再帰コピー: scp -r(ディレクトリ用)
  • ポート指定: scp -P ポート番号(大文字!)
  • 属性保持: scp -p(バックアップ用)
  • 秘密鍵: scp -i ~/.ssh/id_rsa
  • 圧縮: scp -C(遅い接続向け)

scpはシンプルで強力。スクリプトやcronでの自動ファイル転送に最適です。ssshh経由だから暗号化されて安心ですよ!