2026年6月2日
2026年6月2日
scpでサーバー間ファイルを転送する方法
はじめに
scp(Secure Copy)はSSHを使ってサーバー間でファイルを安全に転送するコマンドです。設定ファイルの配布、バックアップの移動、ログ収集など、サーバー運用で頻繁に使用します。
本記事ではscpの基本構文、ディレクトリ転送、ポート指定、サーバー間直接転送までを実例とともに解説します。
症状・背景
- ローカルからリモートサーバーへファイルを送りたい
- リモートからローカルへログファイルをダウンロードしたい
- 2台のリモートサーバー間で直接ファイルを移動したい
- 大量のファイルを再帰的に転送したい
手順・設定方法
ステップ1: ローカルからリモートへ送信
# 単一ファイルを送信
scp localfile.txt user@example.com:/tmp/
# ファイル名を変更しながら送信
scp localfile.txt user@example.com:/tmp/renamed.txt
# ポート指定で送信
scp -P 2222 file.tar.gz user@example.com:~/backup/
# 鍵ファイルを指定して送信
scp -i ~/.ssh/mykey.pem file.txt user@example.com:/tmp/
ステップ2: リモートからローカルへ取得
# 単一ファイルをダウンロード
scp user@example.com:/var/log/nginx/access.log ./
# ディレクトリを再帰的にダウンロード
scp -r user@example.com:/etc/nginx/ ./nginx-backup/
# ワイルドカードで複数ファイル取得(引用符必須)
scp 'user@example.com:/var/log/*.log' ./logs/
ステップ3: ディレクトリと圧縮転送
# ディレクトリ全体を再帰的に転送
scp -r /var/www/html user@example.com:/var/www/
# 転送中に圧縮(低速回線で有効)
scp -C largefile.iso user@example.com:/tmp/
# 帯域制限(Kbit/s)
scp -l 5000 large.zip user@example.com:/tmp/
# 進捗を詳細表示
scp -v file.txt user@example.com:/tmp/
ステップ4: サーバー間の直接転送
# サーバーAからサーバーBへ直接転送
scp user1@host1:/data/file.txt user2@host2:/backup/
# ローカル経由を強制(-3オプション)
scp -3 user1@host1:/file.txt user2@host2:/dest/
# パーミッションと時刻を保持
scp -p file.txt user@example.com:/tmp/
# 大量ファイルはtarとパイプの方が高速
tar -czf - /data | ssh user@host "cat > /backup/data.tar.gz"
注意事項
- scpはOpenSSH 9.0以降では非推奨化されており、長期的には
sftpやrsyncへの移行を推奨 - リモート側でワイルドカードを使う場合は引用符で囲んでローカル展開を防ぐ
- 大量小ファイルの転送では
rsyncの方が効率的 - パスにスペースを含む場合はエスケープまたは引用符で囲む
まとめ
1. 基本構文はscp 送信元 送信先の順、リモートはuser@host:path
2. -rでディレクトリ再帰、-Pでポート指定(大文字)
3. -Cで圧縮、-lで帯域制限、-pで属性保持
4. モダン環境ではrsyncやsftpへの移行も検討する
関連記事: