ファイル転送の基本:scp / rsync の使い分けと事故らない型
この記事で解決できること
scpとrsyncの 正しい使い分け が分かる- 「Permission denied」「転送されたはずなのに無い」などの 定番事故を即切り分け できる
- サーバ運用で 安全にファイルを運ぶ型 が身につく
結論(実務の型)
- 一発コピー・小規模 →
scp - 大量 / 定期 / 再実行前提 →
rsync - 事故る原因の8割は ①ユーザー ②パス ③権限 ④容量 のどれか
前提(対象環境)
- OS:Ubuntu
- SSH接続可能
- ローカル ↔ サーバ、サーバ ↔ サーバ両方を想定
1. scp:単発コピーの基本
結論:
scpは単発コピー向け。ディレクトリは-rが必須で、付け忘れると何もコピーされない。
1-1. ローカル → サーバ
$ scp local.txt user@server:/path/to/dir/
1-2. サーバ → ローカル
$ scp user@server:/path/to/file.txt .
1-3. ディレクトリを丸ごと
$ scp -r mydir user@server:/path/to/
-r 忘れ=何もコピーされない(初心者あるある)
2. scp の事故パターン
結論:
Permission deniedは権限・ユーザー違いが原因。相対パス誤解で転送先がホーム配下になる事故も多い。
2-1. Permission denied
原因候補:
- 書き込み権限がない
- ユーザーを間違えている
/root配下に置こうとしている
切り分け:
$ ssh user@server $ ls -ld /path/to/dir $ whoami
2-2. 転送された「はず」なのに見当たらない
原因:相対パスを誤解している
# NG: ホームディレクトリの tmp/ に入る $ scp file.txt user@server:tmp/ # OK: /tmp/ に入る $ scp file.txt user@server:/tmp/
3. rsync:実務で使う本命
結論: 実務の本命は
rsync -av。-aで属性保持、-vで詳細表示、-zで圧縮が基本セット。
3-1. 基本形(まずはこれ)
$ rsync -av src/ user@server:/path/to/dst/
オプションの意味:
-a:属性保持(ほぼ必須)-v:詳細表示-z:圧縮(遅い回線で有効)
4. rsync 最大の罠:スラッシュ問題
結論:
src/は中身だけ、srcはディレクトリごとコピー。末尾スラッシュの有無で結果が変わる最大の罠。
rsync -av src/ dst/ # 中身だけコピー rsync -av src dst/ # srcディレクトリごとコピー
は 意味が違う。
src/→ 中身だけ コピーsrc→ srcディレクトリごと コピー
事故率が一番高いポイント。必ず意識する。
5. dry-run(事故防止の切り札)
結論: 本番前は
--dry-runで確認。表示内容が実際に起きることなので、不安なら必須。
本番前に必ず確認。
$ rsync -av --dry-run src/ user@server:/path/
表示された内容=実際に起きること 不安なら必須。
6. Permission denied(rsync編)
結論: 書き込み先の権限不足・所有者違いが原因。
--rsync-path="sudo rsync"で回避できる場合がある。
よくある原因:
- 書き込み先の権限不足
- 所有者違い
- sudoが必要
対処例(sudo rsync)
$ rsync -av --rsync-path="sudo rsync" src/ user@server:/root/path/
※ sudo権限がある前提
7. 容量不足で失敗するケース
結論: 転送途中で止まる場合は転送先の容量不足を疑う。
df -hとdu -shで事前確認する。
症状:
- 転送途中で止まる
- エラーが曖昧
確認:
$ df -h $ du -sh src/
転送先ディスクが満杯だと失敗する(no space left on device)
8. scp と rsync の使い分けまとめ
結論: 単発ファイルはscp、ディレクトリ・再実行・大量データの転送にはrsyncを使い分けるのが推奨。
| 用途 | 推奨 |
|---|---|
| 単発ファイル | scp |
| ディレクトリ | rsync |
| 再実行前提 | rsync |
| 大量データ | rsync |
やってはいけないこと
- パスを確認せず実行
-rを付け忘れる- dry-run無しで rsync
- root直下に投げる
コピペ用:安全テンプレ
# scp(単発) scp file.txt user@server:/path/ # rsync(安全) rsync -av --dry-run src/ user@server:/path/ rsync -av src/ user@server:/path/