07-3. SCP 安全檔案複製
深入理解 SCP 快速檔案傳輸的原理與應用
目錄
🔐 SCP 安全檔案複製
⏱️ 閱讀時間: 8 分鐘 🎯 難度: ⭐ (簡單)
🎯 本篇重點
理解 SCP 的基本概念、與 SFTP 的差異、常用命令、以及實戰應用場景。
🤔 什麼是 SCP?
SCP (Secure Copy Protocol) = 安全複製協定
一句話解釋: SCP 就像是「加密的 USB 複製貼上」,透過 SSH 加密通道在兩台電腦之間快速複製檔案。
比喻:搬家公司
FTP(明文):
- 用透明箱子搬家
- 所有人都看得到你的物品
→ 不安全
SCP/SFTP(加密):
- 用密封箱子搬家
- 只有你能打開
→ 安全
SCP vs SFTP:
SCP = 快遞員只負責「送貨」
- 簡單、快速
- 只做複製
- 適合單次傳輸
SFTP = 提供完整「搬家服務」
- 功能完整
- 可以管理檔案(列表、刪除、重新命名)
- 適合複雜操作🏗️ SCP 在網路模型中的位置
OSI 7 層模型
┌──────────────────────────────┬─────────────────┐
│ 7. Application Layer (應用層) │ SCP │ ← SCP 在這裡
├──────────────────────────────┼─────────────────┤
│ 6. Presentation Layer (表示層)│ SSH (加密) │
├──────────────────────────────┼─────────────────┤
│ 5. Session Layer (會話層) │ SSH (會話) │
├──────────────────────────────┼─────────────────┤
│ 4. Transport Layer (傳輸層) │ TCP │
├──────────────────────────────┼─────────────────┤
│ 3. Network Layer (網路層) │ IP │
├──────────────────────────────┼─────────────────┤
│ 2. Data Link Layer (資料鏈結層)│ Ethernet │
├──────────────────────────────┼─────────────────┤
│ 1. Physical Layer (實體層) │ 網路線、光纖 │
└──────────────────────────────┴─────────────────┘SCP 位於第 7 層(應用層)
- SCP 是應用層協定
- 基於 SSH 協定
- 提供加密的檔案複製服務
TCP/IP 4 層模型
┌─────────────────────────────┬─────────────────┐
│ 4. Application Layer (應用層) │ SCP (over SSH) │ ← SCP 在這裡
├─────────────────────────────┼─────────────────┤
│ 3. Transport Layer (傳輸層) │ TCP │
├─────────────────────────────┼─────────────────┤
│ 2. Internet Layer (網際網路層)│ IP │
├─────────────────────────────┼─────────────────┤
│ 1. Network Access (網路存取層)│ Ethernet │
└─────────────────────────────┴─────────────────┘SCP 位於第 4 層(應用層)
- 在 TCP/IP 模型中,SCP 是應用層協定
- 完全基於 SSH(Port 22)
- 使用 TCP 提供可靠傳輸
對比表:
| 協定 | OSI 層級 | TCP/IP 層級 | 底層協定 | Port | 加密 | 複雜度 | 功能 |
|---|---|---|---|---|---|---|---|
| FTP | Layer 7 | Layer 4 | TCP | 21/20 | ❌ | 高 | 完整 |
| FTPS | Layer 7 | Layer 4 | TCP+SSL | 990 | ✅ | 高 | 完整 |
| SFTP | Layer 7 | Layer 4 | SSH | 22 | ✅ | 中 | 完整 |
| SCP | Layer 7 | Layer 4 | SSH | 22 | ✅ | 低 | 簡單 |
| rsync | Layer 7 | Layer 4 | SSH/TCP | 22/873 | 可選 | 中 | 進階 |
重點:
- SCP 是應用層協定(兩種模型都是)
- 100% 基於 SSH(Port 22)
- 單一連線,不像 FTP 有控制+數據雙連線
- 加密傳輸(SSH 提供)
- 最簡單的安全檔案傳輸工具
SCP 的特色:
優點:
✅ 簡單易用(一行命令搞定)
✅ 加密安全(SSH 加密)
✅ 速度快(比 SFTP 快)
✅ 內建在大多數系統(Linux、macOS、Windows 10+)
✅ 防火牆友善(只用 Port 22)
缺點:
❌ 功能簡單(只能複製)
❌ 不支援續傳(大檔案中斷要重來)
❌ 不能列出檔案(要用 ls 或 SFTP)
❌ 不能刪除遠端檔案
❌ 效能不如 rsync(不支援增量同步)
適用場景:
✅ 快速複製單一檔案或目錄
✅ 伺服器之間傳輸設定檔
✅ 備份小型資料
✅ 簡單的檔案部署
不適用場景:
❌ 需要續傳的大檔案(用 rsync)
❌ 需要檔案管理(用 SFTP)
❌ 需要增量同步(用 rsync)🔍 SCP vs SFTP vs rsync
三者對比
場景 1:複製單一檔案
SCP:
$ scp file.txt user@server:/path/
→ 簡單、快速 ✅
SFTP:
$ sftp user@server
sftp> put file.txt /path/
→ 需要互動式操作 ⚠️
rsync:
$ rsync file.txt user@server:/path/
→ 功能強大但 overkill ⚠️
結論:SCP 最適合場景 2:同步大型目錄(增量)
SCP:
$ scp -r dir/ user@server:/path/
→ 每次都傳全部檔案 ❌
SFTP:
無法批次同步 ❌
rsync:
$ rsync -avz dir/ user@server:/path/
→ 只傳修改的檔案 ✅
→ 支援斷點續傳 ✅
結論:rsync 最適合場景 3:互動式檔案管理
SCP:
無法列出、刪除檔案 ❌
SFTP:
$ sftp user@server
sftp> ls
sftp> rm old_file.txt
sftp> get file.txt
→ 完整檔案管理 ✅
rsync:
無法互動式管理 ❌
結論:SFTP 最適合場景 4:傳輸速度對比
100MB 檔案傳輸(實測):
SCP: ~8 秒 ✅ 最快
rsync: ~10 秒 ⚡ 快
SFTP: ~12 秒 🐢 較慢
原因:
SCP:最簡單,開銷最小
rsync:需要計算差異
SFTP:需要額外的協定開銷
結論:
單次傳輸 → SCP 最快
增量同步 → rsync 整體最快選擇建議
選擇 SCP:
✅ 快速複製單一檔案
✅ 簡單的目錄複製
✅ 不需要續傳
✅ 追求速度
選擇 SFTP:
✅ 需要互動式檔案管理
✅ 列出、刪除、重新命名檔案
✅ 圖形化工具(FileZilla、WinSCP)
✅ 需要續傳(部分支援)
選擇 rsync:
✅ 大型目錄同步
✅ 增量備份
✅ 需要續傳
✅ 跨網路備份
✅ 需要保留權限、時間戳💻 SCP 基本用法
上傳檔案(本機 → 遠端)
# 基本語法
scp 本機檔案 user@server:遠端路徑
# 上傳單一檔案
scp file.txt user@192.168.1.100:/home/user/
# 上傳到遠端的特定目錄
scp report.pdf admin@server.com:/var/www/html/
# 指定 SSH port
scp -P 2222 file.txt user@server:/path/
# 顯示進度
scp -v file.txt user@server:/path/
# 保留檔案權限和時間戳
scp -p file.txt user@server:/path/
# 壓縮傳輸(加快速度)
scp -C largefile.tar user@server:/path/
# 限制頻寬(單位:KB/s)
scp -l 1000 file.txt user@server:/path/
→ 限制在 1MB/s下載檔案(遠端 → 本機)
# 基本語法
scp user@server:遠端檔案 本機路徑
# 下載單一檔案
scp user@server:/home/user/file.txt ./
# 下載到本機特定目錄
scp admin@server.com:/var/log/app.log ~/logs/
# 下載時重新命名
scp user@server:/path/file.txt ./newname.txt
# 從特定 Port 下載
scp -P 2222 user@server:/path/file.txt ./
# 下載多個檔案(使用萬用字元)
scp user@server:"/path/*.log" ./logs/
# 顯示詳細資訊
scp -v user@server:/path/file.txt ./複製目錄(遞迴)
# 上傳整個目錄
scp -r local_dir/ user@server:/path/
範例:
scp -r ~/project/ user@192.168.1.100:/var/www/
# 下載整個目錄
scp -r user@server:/path/remote_dir/ ./
範例:
scp -r admin@server:/var/www/html/ ~/backup/
# 保留權限 + 遞迴
scp -rp user@server:/path/dir/ ./
# 壓縮 + 遞迴(加快速度)
scp -rC user@server:/path/dir/ ./
# 排除特定檔案(需要搭配 rsync)
# SCP 無法排除,改用 rsync:
rsync -avz --exclude '*.log' dir/ user@server:/path/兩台遠端伺服器之間複製
# 從 Server A 複製到 Server B
scp user1@serverA:/path/file.txt user2@serverB:/path/
範例:
scp admin@192.168.1.100:/data/backup.tar \
admin@192.168.1.200:/backup/
# 透過本機中轉(3-way SCP)
# 流程:Server A → 你的電腦 → Server B
scp -3 user1@serverA:/path/file.txt user2@serverB:/path/
注意:
-3 會讓流量經過你的電腦
如果兩台 Server 可以直接連線,不需要 -3🚀 SCP 進階技巧
使用 SSH 金鑰(免密碼)
# 步驟 1:產生 SSH 金鑰(如果還沒有)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 步驟 2:複製公鑰到遠端伺服器
ssh-copy-id user@server
# 步驟 3:現在可以免密碼使用 SCP
scp file.txt user@server:/path/
→ 不需要輸入密碼!
# 指定特定金鑰
scp -i ~/.ssh/custom_key file.txt user@server:/path/使用 SSH Config 簡化命令
# 編輯 ~/.ssh/config
vi ~/.ssh/config
# 設定別名
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host webserver
HostName web.example.com
User deploy
Port 22
# 保存後,使用別名
scp file.txt myserver:/path/
→ 等於 scp -P 2222 -i ~/.ssh/id_ed25519 file.txt admin@192.168.1.100:/path/
scp file.txt webserver:/var/www/
→ 簡單多了!批次複製多個檔案
# 方法 1:使用大括號展開
scp file{1,2,3}.txt user@server:/path/
→ 複製 file1.txt, file2.txt, file3.txt
# 方法 2:使用萬用字元(需要引號)
scp "*.log" user@server:/path/
scp "file?.txt" user@server:/path/
# 方法 3:複製多個不同檔案
scp file1.txt file2.pdf file3.log user@server:/path/
# 方法 4:使用迴圈
for file in *.txt; do
scp "$file" user@server:/path/
done顯示傳輸進度
# 使用 -v(verbose)顯示詳細資訊
scp -v file.txt user@server:/path/
# 使用 pv(pipe viewer)顯示進度條
# 安裝 pv
sudo apt install pv # Ubuntu/Debian
brew install pv # macOS
# 使用 pv 顯示進度
pv file.txt | ssh user@server "cat > /path/file.txt"
輸出:
450MB 0:00:45 [10.0MB/s] [=========> ] 45% ETA 0:00:55
# 使用 rsync 替代(有內建進度)
rsync -avz --progress file.txt user@server:/path/
輸出:
file.txt
1,048,576 100% 9.53MB/s 0:00:00 (xfr#1, to-chk=0/1)限制頻寬(避免佔滿網路)
# 使用 -l 限制(單位:Kbit/s)
scp -l 8000 largefile.tar user@server:/path/
→ 限制在 1MB/s (8000 Kbit/s = 1000 KB/s)
# 限制在 5MB/s
scp -l 40000 largefile.tar user@server:/path/
# 為什麼要限制?
場景 1:公司網路
- 避免 SCP 佔滿頻寬
- 影響其他人上網
場景 2:伺服器傳輸
- 避免影響正常服務
- 在非尖峰時段放寬限制
建議:
- 白天:限制 1-5MB/s
- 晚上:限制 10MB/s 或不限制🛡️ SCP 安全性
SSH 加密保護
SCP 的安全性來自 SSH:
1. 加密傳輸
- 所有資料透過 SSH 加密
- 使用 AES-256、ChaCha20 等強加密
- 無法被竊聽
2. 身份驗證
- 密碼認證
- 公私鑰認證(更安全)
- 雙因素認證(可選)
3. 完整性保護
- HMAC 驗證
- 確保檔案未被竄改
4. 主機驗證
- 確認伺服器身份
- 防止中間人攻擊安全最佳實踐
# 1. 使用公私鑰認證(不要用密碼)
ssh-keygen -t ed25519
ssh-copy-id user@server
# 2. 限制 SSH 存取(伺服器端)
# /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
AllowUsers user1 user2
# 3. 使用防火牆(只開放必要 IP)
sudo ufw allow from 192.168.1.0/24 to any port 22
# 4. 啟用 Fail2ban(防暴力破解)
sudo apt install fail2ban
# 5. 檔案權限檢查(上傳後)
scp file.txt user@server:/path/
ssh user@server "chmod 600 /path/file.txt"
→ 確保只有擁有者可讀寫
# 6. 使用 sudo 限制(避免直接 root)
# 錯誤:
scp file.txt root@server:/etc/config
# 正確:
scp file.txt user@server:/tmp/
ssh user@server "sudo mv /tmp/config /etc/config"🐛 常見問題與解決
問題 1:Permission denied
$ scp file.txt user@server:/root/
Permission denied
原因:
沒有權限寫入 /root/
解決:
# 方法 1:先複製到 /tmp/
scp file.txt user@server:/tmp/
ssh user@server "sudo mv /tmp/file.txt /root/"
# 方法 2:使用有權限的目錄
scp file.txt user@server:~/問題 2:Connection refused
$ scp file.txt user@server:/path/
ssh: connect to host server port 22: Connection refused
原因:
1. SSH 服務未啟動
2. 防火牆阻擋
3. Port 不對(不是 22)
解決:
# 檢查 SSH 服務(Server 端)
sudo systemctl status sshd
# 啟動 SSH
sudo systemctl start sshd
# 檢查 Port(如果不是 22)
scp -P 2222 file.txt user@server:/path/
# 檢查防火牆
sudo ufw status
sudo ufw allow 22問題 3:Host key verification failed
$ scp file.txt user@server:/path/
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
原因:
伺服器重裝或 IP 換人用
解決:
# 刪除舊的 host key
ssh-keygen -R server
或
ssh-keygen -R 192.168.1.100
# 再次連線會要求確認新的 key
scp file.txt user@server:/path/問題 4:檔案已存在,如何覆蓋?
# SCP 預設會覆蓋同名檔案
# 備份舊檔案
ssh user@server "mv /path/file.txt /path/file.txt.bak"
scp file.txt user@server:/path/
# 或使用時間戳
ssh user@server "mv /path/file.txt /path/file.txt.$(date +%Y%m%d)"
scp file.txt user@server:/path/問題 5:中斷後如何續傳?
# SCP 不支援續傳!
解決方案:
# 使用 rsync(支援續傳)
rsync -avz --partial file.txt user@server:/path/
參數說明:
-a : 保留權限、時間戳
-v : 顯示詳細資訊
-z : 壓縮傳輸
--partial : 保留部分傳輸的檔案(續傳)
# 中斷後再次執行相同命令
rsync -avz --partial file.txt user@server:/path/
→ 會從中斷處繼續!🎓 面試常見問題
Q1:SCP 和 SFTP 有什麼差別?
A:功能複雜度和使用場景不同
SCP(Secure Copy Protocol):
- 簡單的檔案複製
- 一行命令搞定
- 速度較快
- 不支援互動式操作
範例:
scp file.txt user@server:/path/
→ 快速複製
功能:
✅ 上傳/下載檔案
❌ 列出檔案
❌ 刪除檔案
❌ 重新命名
❌ 續傳(部分)
SFTP(SSH File Transfer Protocol):
- 完整的檔案管理
- 互動式操作
- 功能豐富
- 速度稍慢
範例:
sftp user@server
sftp> ls
sftp> get file.txt
sftp> rm old_file.txt
→ 完整管理
功能:
✅ 上傳/下載檔案
✅ 列出檔案(ls)
✅ 刪除檔案(rm)
✅ 重新命名(rename)
✅ 建立目錄(mkdir)
✅ 部分續傳
選擇建議:
- 快速複製單一檔案 → SCP
- 需要檔案管理 → SFTP
- 需要續傳大檔案 → rsync
記憶:
SCP = Simple, Copy
SFTP = SSH FTP, More featuresQ2:SCP 如何實現加密傳輸?
A:SCP 完全基於 SSH 協定
架構:
SCP 是 SSH 的上層應用
SCP ← SSH ← TCP
流程:
1. 建立 SSH 連線
Client ↔ Server (Port 22)
- SSH 握手
- 金鑰交換(Diffie-Hellman)
- 建立加密通道
2. 在 SSH 通道內傳輸檔案
Client: scp file.txt user@server:/path/
→ SSH 通道內:[加密的檔案內容]
→ Server 收到後解密
3. 傳輸完成,關閉 SSH 連線
加密方式:
- 對稱加密:AES-256-GCM, ChaCha20-Poly1305
- 金鑰交換:ECDH, Curve25519
- MAC:HMAC-SHA2-256
安全特性:
✅ 帳號密碼加密(不會被竊聽)
✅ 檔案內容加密(無法被讀取)
✅ 完整性保護(無法被竄改)
✅ 伺服器身份驗證(防中間人)
vs FTP:
FTP:明文傳輸(帳號、密碼、檔案都可見)
SCP:全程加密(完全安全)Q3:SCP 為什麼不支援續傳?如何解決?
A:SCP 設計簡單,沒有續傳機制
原因:
1. SCP 是古老協定(1983 年)
設計時沒考慮續傳
2. SCP 基於 rcp(遠端複製)
rcp 也不支援續傳
3. SCP 設計哲學:簡單
只做「複製」,不做「同步」
問題:
大檔案傳輸中斷 → 需要重新開始
100GB 檔案傳了 99GB 斷線 → 全部重來 ❌
解決方案:
方案 1:使用 rsync(推薦)
rsync -avz --partial file.txt user@server:/path/
優點:
✅ 支援續傳(--partial)
✅ 增量同步(只傳差異)
✅ 壓縮傳輸
✅ 保留權限、時間戳
範例:
# 第一次傳輸(中斷)
rsync -avz --partial bigfile.tar user@server:/path/
^C (中斷)
# 再次執行(續傳)
rsync -avz --partial bigfile.tar user@server:/path/
→ 從中斷處繼續!
方案 2:使用 SFTP(部分支援)
某些 SFTP 客戶端支援續傳(如 FileZilla)
方案 3:分割檔案
# 分割成多個小檔案
split -b 100M bigfile.tar part_
→ part_aa, part_ab, part_ac...
# 逐一傳輸
for part in part_*; do
scp "$part" user@server:/path/
done
# Server 端合併
ssh user@server "cat /path/part_* > /path/bigfile.tar"
選擇:
小檔案(< 1GB)→ SCP
大檔案(> 1GB)→ rsyncQ4:如何用 SCP 安全地傳輸敏感檔案?
A:三層防護
1️⃣ SSH 加密(預設)
SCP 本身已加密
檔案內容在傳輸中無法被竊聽
2️⃣ 檔案加密(額外)
傳輸前先加密檔案
# 使用 GPG 加密
gpg -c sensitive.txt
→ 產生 sensitive.txt.gpg(加密檔案)
# 傳輸加密檔案
scp sensitive.txt.gpg user@server:/path/
# Server 端解密
ssh user@server
gpg -d /path/sensitive.txt.gpg > /path/sensitive.txt
優點:
雙重加密(SSH + GPG)
即使 SSH 被破解,檔案仍安全
# 或使用 OpenSSL
openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc
scp file.txt.enc user@server:/path/
ssh user@server "openssl enc -d -aes-256-cbc -in file.txt.enc -out file.txt"
3️⃣ 權限控制(上傳後)
# 確保只有擁有者可讀
scp sensitive.txt user@server:/path/
ssh user@server "chmod 600 /path/sensitive.txt"
# 檢查權限
ssh user@server "ls -l /path/sensitive.txt"
-rw------- 1 user user 1234 Jan 15 20:00 sensitive.txt
↑
只有擁有者可讀寫
4️⃣ 傳輸後刪除本機檔案
scp sensitive.txt user@server:/path/
rm -P sensitive.txt # macOS
shred -u sensitive.txt # Linux(安全刪除)
完整流程:
# 1. 加密
gpg -c file.txt
# 2. 傳輸
scp file.txt.gpg user@server:/path/
# 3. 設定權限
ssh user@server "chmod 600 /path/file.txt.gpg"
# 4. 刪除本機
shred -u file.txt file.txt.gpg
# 5. Server 解密
ssh user@server "gpg -d /path/file.txt.gpg > /path/file.txt"
面試加分:
提到「端到端加密」(E2E Encryption)
SCP 只保護傳輸過程
檔案加密保護端到端✅ 重點回顧
SCP 定義:
- SCP = Secure Copy Protocol
- 基於 SSH 的安全檔案複製工具
- Port 22(SSH)
SCP 特色:
- ✅ 簡單易用(一行命令)
- ✅ 加密安全(SSH 加密)
- ✅ 速度快
- ❌ 不支援續傳
- ❌ 功能簡單(只能複製)
基本命令:
# 上傳
scp file.txt user@server:/path/
# 下載
scp user@server:/path/file.txt ./
# 遞迴複製目錄
scp -r dir/ user@server:/path/
# 使用特定 Port
scp -P 2222 file.txt user@server:/path/
# 保留權限
scp -p file.txt user@server:/path/
# 壓縮傳輸
scp -C file.txt user@server:/path/
# 限制頻寬
scp -l 8000 file.txt user@server:/path/vs SFTP vs rsync:
| 工具 | 功能 | 續傳 | 增量 | 速度 | 適用場景 |
|---|---|---|---|---|---|
| SCP | 簡單 | ❌ | ❌ | 最快 | 快速複製 |
| SFTP | 完整 | 部分 | ❌ | 中等 | 檔案管理 |
| rsync | 進階 | ✅ | ✅ | 快 | 同步/備份 |
安全性:
- 基於 SSH(AES-256 加密)
- 公私鑰認證
- 完整性保護(HMAC)
- 主機驗證
常用參數:
-r:遞迴複製目錄-p:保留權限和時間戳-P:指定 SSH port-C:壓縮傳輸-l:限制頻寬-v:詳細輸出
面試重點:
- ✅ SCP vs SFTP 差異
- ✅ 為什麼不支援續傳(用 rsync)
- ✅ 如何加密敏感檔案(GPG)
- ✅ 基於 SSH,使用 Port 22
記憶口訣:
- SCP = 「Simple Copy Protocol」(雖然不是真的縮寫)
- 選擇 = 「快(scp)、管(sftp)、同(rsync)」
上一篇: 07-2. SFTP 安全傳輸 下一篇: 08-1. SSH 安全遠端登入
相關文章:
最後更新:2025-01-15