scp 指令:用法與選項、複製資料夾與指定連接埠

測試環境RHEL 系列AlmaLinux 9.8OpenSSH 9.9p1接收端 Debian 12 · OpenSSH 9.2p1root 帳號2026-10-28 確認

scp 是與透過 SSH 連線的伺服器交換檔案時使用的複製工具。用 scp 指令傳送檔案時,和 cp 一樣,來源寫在前面,目的地寫在後面。我們從 AlmaLinux 9 伺服器向 Debian 12 伺服器傳送檔案與資料夾並取回,結果傳輸是透過 SFTP 協定進行,而且一個 20MB 檔案在 1 秒內就送達。

以下輸出都是在傳送端以 root 帳號執行 OpenSSH 9.9 的 scp 所得到的原始結果,只把伺服器位址和帳號名稱換成範例值。

1️⃣ scp 用法與遠端路徑

遠端伺服器的路徑前面要加上 [帳號@伺服器位址:]。沒有冒號的路徑會被視為執行指令那台伺服器上的路徑,因此冒號出現在哪一邊,就決定是傳送還是接收。

🧭 scp 複製方向與遠端路徑
說明圖解
↔️ 複製方向
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
來源💻 執行指令的伺服器report.txt
➜
目的地🖥️ 遠端伺服器203.0.113.10:~/scp-test/
來源🖥️ 遠端伺服器203.0.113.10:~/scp-test/report.txt
➜
目的地💻 執行指令的伺服器./downloads/
來源🖥️ 遠端伺服器 A203.0.113.10:~/scp-test/report.txt
➜
中繼💻 執行指令的伺服器-3
➜
目的地🖥️ 遠端伺服器 B198.51.100.20:~/scp-test/
🧩 遠端路徑格式
user 要連線的帳號, 203.0.113.10 伺服器位址或網域, :~/scp-test/ 冒號後面是該伺服器上的路徑(波浪號代表家目錄)
本機檔案寫在前、遠端路徑寫在後就是傳送。冒號後的路徑如果以斜線結尾,檔案會以相同名稱存進該資料夾。
遠端路徑寫在前就是接收。收到的檔案會留在後面寫的本機路徑。
來源和目的地都是遠端伺服器時,從 OpenSSH 8.7 起,資料會經過執行指令的伺服器。這和加上 -3 的方式相同。

把目前資料夾的 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.txt
report.txt                                    100%   14     4.6KB/s   00:00

🔲 scp 指令模擬器

在下面的模擬器中,你可以親自輸入傳送、接收和複製資料夾的指令,確認各選項的輸出。

scp 指令模擬器OpenSSH 9.9
[root@server work]#
只在瀏覽器內運作。可在左側清單確認遠端檔案,並用 ↑↓ 叫回先前的指令。

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.gz
backup.tar.gz                                 100%   20MB 996.5KB/s   00:20

-C 會以和 gzip 相同的方式壓縮 SSH 連線中的資料。我們把重複相同句子的 19MB 記錄檔各傳送三次,結果在這兩台伺服器之間,加上 -C 的一方稍慢。

指令檔案執行時間進度顯示速度
scp backup.tar.gz20MB0.68 秒53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82 秒996.5KB/s
scp access.log(3 次)19MB0.79~0.89 秒—
scp -C access.log(3 次)19MB0.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.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh 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_ed25519

Host 那一行的名稱就是別名,下面四行代替伺服器位址、帳號、連接埠和金鑰檔案。只寫別名的指令,也和寫滿位址與金鑰時一樣以相同的一行結果結束。

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 則比較來源和目的地,只傳輸有變更的檔案。

項目scprsync
傳輸範圍每次執行都傳送指定的全部檔案只傳與來源不同的已變更檔案
保留接收到一半的檔案(--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.txt
report.txt                                    100%   14     5.6KB/s   00:00

官方手冊說明,舊的 SFTP 伺服器無法把以波浪號開頭的路徑轉換成家目錄時,要使用 -O。這時像上面那樣不寫波浪號,以家目錄為基準寫路徑,也會存到相同位置。

🔢 FAQ & 推薦內容

有同名檔案時,不會詢問就直接以新檔案覆寫。把同一個 report.txt 多次傳送到同一個資料夾時,也是每次都未經確認就傳輸。因此,必須保留的檔案要在目的地路徑結尾寫上別的名稱再傳送。

在遠端路徑放入 * 並用單引號包住,就會接收遠端伺服器上名稱相符的所有檔案。接收遠端伺服器的 report-*.txt 時,名稱相符的六個檔案依序傳輸。引號的用途是避免執行指令那台伺服器的 Shell 先解譯 *。

加上 -B 就會以不詢問密碼或密語的批次模式執行。依官方手冊,這個模式無法輸入密碼,因此 cron 之類的自動作業要先設定金鑰驗證。

🧭 網路指令推薦內容 文章 13 · 參考 2
🗂️ 網路指令
📄 ip 指令 📄 netstat · ifconfig 指令 📄 nmtui 指令
📄 SSH 指令 📄 rsync 指令 📄 wget 指令 📄 rz · sz 指令 📄 scp 指令
📄 host 指令 📄 nslookup 指令
📄 iptables 指令 📄 firewall-cmd 指令 📄 certbot 指令

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 8   +   8   =