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以降では非推奨化されており、長期的にはsftprsyncへの移行を推奨
  • リモート側でワイルドカードを使う場合は引用符で囲んでローカル展開を防ぐ
  • 大量小ファイルの転送ではrsyncの方が効率的
  • パスにスペースを含む場合はエスケープまたは引用符で囲む

まとめ

1. 基本構文scp 送信元 送信先の順、リモートはuser@host:path

2. -rでディレクトリ再帰、-Pでポート指定(大文字)

3. -Cで圧縮、-lで帯域制限、-pで属性保持

4. モダン環境ではrsyncやsftpへの移行も検討する

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ