scp 指令:用法與選項、複製資料夾與指定連接埠
scp 是與透過 SSH 連線的伺服器交換檔案時使用的複製工具。用 scp 指令傳送檔案時,和 cp 一樣,來源寫在前面,目的地寫在後面。我們從 AlmaLinux 9 伺服器向 Debian 12 伺服器傳送檔案與資料夾並取回,結果傳輸是透過 SFTP 協定進行,而且一個 20MB 檔案在 1 秒內就送達。
以下輸出都是在傳送端以 root 帳號執行 OpenSSH 9.9 的 scp 所得到的原始結果,只把伺服器位址和帳號名稱換成範例值。
1️⃣ scp 用法與遠端路徑
遠端伺服器的路徑前面要加上 [帳號@伺服器位址:]。沒有冒號的路徑會被視為執行指令那台伺服器上的路徑,因此冒號出現在哪一邊,就決定是傳送還是接收。
把目前資料夾的 report.txt 傳送到遠端伺服器家目錄下的 scp-test 資料夾。
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00傳輸結束後,檔案名稱、進度、大小、速度和耗時會顯示在一行。這個進度顯示只有在終端機執行時才會出現,因此把輸出導向檔案時,檔案裡什麼都不會留下。
接收時,遠端路徑寫在前面,要儲存的本機路徑寫在後面。
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00目的地路徑如果以檔案名稱而非資料夾結尾,就會以該名稱儲存。用下面的指令傳送後,接收端資料夾裡的 report.txt 以 report-1028.txt 這個名稱留存。
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 scp 指令模擬器
在下面的模擬器中,你可以親自輸入傳送、接收和複製資料夾的指令,確認各選項的輸出。
2️⃣ scp 指令選項
選項寫在 scp 後面、來源之前。指定連接埠的 -P 是大寫,小寫的 -p 則是保留時間與權限的選項,大小寫打錯就會執行不同的動作。
-l 以 Kbit/s 為單位指定傳輸速度上限。不加選項傳送 20MB 檔案時,傳輸在 1 秒內就結束。
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 相當於每秒約 1,000KB。用 -l 8000 傳送同一個檔案時,進度顯示的速度為 996.5KB/s,傳輸花了 20 秒。
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C 會以和 gzip 相同的方式壓縮 SSH 連線中的資料。我們把重複相同句子的 19MB 記錄檔各傳送三次,結果在這兩台伺服器之間,加上 -C 的一方稍慢。
| 指令 | 檔案 | 執行時間 | 進度顯示速度 |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0.68 秒 | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 秒 | 996.5KB/s |
| scp access.log(3 次) | 19MB | 0.79~0.89 秒 | — |
| scp -C access.log(3 次) | 19MB | 0.84~0.97 秒 | — |
執行時間是從啟動指令、連線到傳輸結束的時間。ssh 手冊也說明,壓縮在低速線路上有效,在高速網路上則會拖慢傳輸。
-v 會把從連線到傳輸的過程以 debug1 行輸出,因此可在無法連線或卡在驗證時用來找原因。輸出很長,所以我們用 grep 只挑出驗證與傳輸的行。
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 seconds[Sending subsystem: sftp] 這一行表示 scp 以 SFTP 協定傳送檔案。從 OpenSSH 9.0 起,scp 預設使用 SFTP。加上 -O 會以舊的 SCP 協定傳輸,同一位置會出現 [Sending command: scp -v -t]。
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 主要選項:本文實際執行的結果
| 選項 | 作用 | 本文看到的結果 | |
|---|---|---|---|
| -P | 指定 SSH 連線連接埠 | 連接埠 22 完成 report.txt 傳輸,未開放的連接埠 2222 以 [Connection timed out] 結束 | |
| -i | 指定公開金鑰驗證使用的私密金鑰檔案 | 指定 ~/.ssh/id_ed25519 後完成 report.txt 傳輸 | |
| -r | 複製資料夾內的檔案和子資料夾 | 接收端的 css 和 images 資料夾維持原本結構,不加則因 [not a regular file] 錯誤而不傳輸 | |
| -p | 保留來源的修改時間、存取時間和權限 | 修改時間保留,本文的接收端只有以 -O -p 傳送的檔案保留權限 600 | |
| -C | 壓縮 SSH 連線中的資料 | 本文兩台伺服器之間的 19MB 記錄檔,加上此選項的一方稍慢 | |
| -l | 以 Kbit/s 為單位指定傳輸速度上限 | -l 8000 傳送 20MB 為 996.5KB/s、20.82 秒 | |
| -v | 把從連線到傳輸的過程以 debug1 行輸出 | 以 [Sending subsystem: sftp] 這一行確認為 SFTP 傳輸 | |
| -3 | 讓兩台遠端伺服器之間的資料經由執行指令的伺服器傳輸(OpenSSH 8.7 起的預設方式) | 以同一台伺服器的兩個資料夾作為來源和目的地,完成 report.txt 傳輸 | |
| -O | 以舊的 SCP 協定傳輸 | -v 輸出中出現 [Sending command: scp -v -t],含空格的路徑需要多加反斜線 | |
| -o | 把 ssh_config 格式的選項傳給 ssh | 以 ConnectTimeout=10 把等待時間設為 10 秒,確認 [Connection timed out] |
📎 其他選項:依官方手冊
| 選項 | 作用 | |
|---|---|---|
| -q | 關閉進度顯示以及 ssh 的警告和診斷訊息 | |
| -J | 先連線到跳板主機,再從該處設定通往最終目的地的 TCP 轉送(ProxyJump 設定的簡寫,多個跳點以逗號分隔) | |
| -F | 把 ssh 的使用者設定檔指定為其他檔案(直接傳給 ssh) | |
| -4 | 強制只使用 IPv4 位址 | |
| -6 | 強制只使用 IPv6 位址 |
3️⃣ scp 複製資料夾與保留時間
不加選項就指定資料夾時,scp 會輸出這不是一般檔案的錯誤,不進行傳輸。
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/加上 -r 就會複製資料夾內的檔案和子資料夾。
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00輸出只顯示檔案名稱。接收端的 find 輸出中,site-files 下的 css 和 images 資料夾維持原本結構。
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r 會跟隨資料夾內的符號連結並複製原始檔案,因此連結必須維持為連結的資料夾,適合使用 rsync -a。
-p 會保留來源的修改時間、存取時間和權限。原始的 report.txt 先把修改時間設為 2026 年 10 月 1 日 00:00(UTC)、權限設為 600 後才傳送。接收端伺服器的時區是 UTC,所以傳送端的 ls 也以 TZ=UTC 輸出。
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txt以 -p 傳送的 report-p.txt 和以 -O -p 傳送的 report-Op.txt 保留了原始時間,不加選項傳送的 report.txt 則以傳送時間儲存。在接收端伺服器上,以 SFTP 傳送的檔案即使加上 -p,權限也存為 664,只有以舊 SCP 協定(-O)傳送的檔案保留 600。
因此,權限也必須與來源相同的檔案,傳送後要在接收端用 ls -l 確認權限。
4️⃣ scp 指定連接埠與金鑰檔案
無法以預設連接埠 22 和預設金鑰連線的伺服器,要在傳送前自行指定連接埠和金鑰。-P 指定 SSH 連線連接埠,-i 指定公開金鑰驗證使用的私密金鑰檔案。
下面是直接指定連接埠 22 和金鑰檔案的例子。如果伺服器改過連接埠,就把 22 換成該號碼。
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00不加 -i 時,會和 ssh 一樣依序使用 ~/.ssh 下預設名稱的金鑰(id_rsa、id_ecdsa、id_ed25519 等)。
如果經常傳送到同一台伺服器,可在 ~/.ssh/config 寫好別名,在 scp 中只輸入別名。
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519Host 那一行的名稱就是別名,下面四行代替伺服器位址、帳號、連接埠和金鑰檔案。只寫別名的指令,也和寫滿位址與金鑰時一樣以相同的一行結果結束。
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P、-i 和別名都直接使用 ssh 的連線設定,因此建立金鑰並註冊到伺服器的過程,也和用 SSH 指令連線時相同。
5️⃣ scp 伺服器之間複製
來源和目的地都是遠端伺服器時,一行 scp 也能複製。從 OpenSSH 8.7 起,資料會經由執行指令的伺服器傳輸,這個方式就是 -3。官方版本資訊提到,改為預設方式的原因是不必把目的地伺服器的驗證資訊放在來源伺服器上。
下面的實測是以同一台伺服器的兩個資料夾作為來源和目的地執行。如果目的地伺服器不同,只要改後面的帳號和位址。
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00就像總公司收下兩間分店之間的文件再轉寄出去。
來源伺服器直接傳送到目的地伺服器的舊方式以 -R 指定。這個方式要求來源伺服器能免密碼連線到目的地伺服器。從 OpenSSH 10.6 起,使用 -R 會出現即將停用的警告,之後的版本預計忽略此選項並改以 -3 方式複製。
6️⃣ scp 與 rsync 比較
傳送幾個檔案一次用 scp 就夠了,而反覆同步同一個資料夾或接續中斷傳輸的工作,適合用 rsync 指令。scp 每次執行都會重新傳送指定的全部檔案,rsync 則比較來源和目的地,只傳輸有變更的檔案。
| 項目 | scp | rsync |
|---|---|---|
| 傳輸範圍 | 每次執行都傳送指定的全部檔案 | 只傳與來源不同的已變更檔案 |
| 保留接收到一半的檔案(--partial) | ❌ | ✅ |
| 刪除來源沒有的檔案(--delete) | ❌ | ✅ |
| 符號連結 | 跟隨並複製原始檔案 | 以 -a 維持連結 |
| 接收端需要的條件 | SSH 連線與 SFTP 伺服器 | 兩端都要安裝 rsync |
7️⃣ scp 指令錯誤訊息與解決方法
scp 失敗時,原因會直接出現在輸出第一行。我們以不存在的檔案、寫入權限和錯誤的連接埠刻意製造的三種錯誤,原因全都出現在第一行,結束代碼也都不是 0。
🔲 No such file or directory
嘗試接收遠端不存在的檔案時,會連同路徑輸出 [No such file or directory]。
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directory傳送時如果目的地資料夾不存在,也會出現相同的錯誤。scp 不會建立不存在的資料夾,所以要先用 ssh 執行 mkdir -p 建立資料夾。
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
接收端資料夾沒有寫入權限時,[dest open] 後面會接著 [Permission denied]。下面是傳送到權限 555 的 readonly 資料夾的結果。
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/[Permission denied] 前面有 [帳號@伺服器位址:],括號內有 publickey 之類的驗證方式時,表示在連線驗證階段遭到拒絕。這段文字是 ssh 程式驗證失敗時的格式,因此要先確認以 -i 指定的金鑰檔案和註冊在伺服器上的公開金鑰。
🔲 Connection timed out
連接埠號碼錯誤,或防火牆封鎖該連接埠而沒有回應時,會一直等待連線,最後以 [Connection timed out] 結束。下面是把等待時間設為 10 秒,傳送到未開放的連接埠 2222 的結果。
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closed出現這個錯誤時,先確認 -P 寫的號碼是否與伺服器的 SSH 連接埠相同。
🔲 路徑中的空格與波浪號(~)
以 SFTP 傳輸的現行 scp,含空格的遠端路徑只要用單引號包一次即可。
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00同一個指令加上 -O 以舊 SCP 協定傳送時,以 [ambiguous target] 失敗。這是因為在舊 SCP 協定中,遠端 Shell 會再解譯一次路徑。
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous target這時要在空格前加上反斜線,讓遠端 Shell 也把它讀成一個字。
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00冒號後的路徑不以斜線或波浪號開頭時,會以遠端帳號的家目錄為基準處理。
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00官方手冊說明,舊的 SFTP 伺服器無法把以波浪號開頭的路徑轉換成家目錄時,要使用 -O。這時像上面那樣不寫波浪號,以家目錄為基準寫路徑,也會存到相同位置。
🔢 FAQ & 推薦內容






ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。



