Linux scp 指令教學-上傳檔案/保留原始時間及權限/壓縮資料/自定義 port/限制傳輸速度

Linux scp 指令教學-上傳檔案/保留原始時間及權限/壓縮資料/自定義 port/限制傳輸速度

不同主機之間經常會需要做資料上傳與下載,一般常見透過 FTP, Web, 第三方軟體來進行傳輸,在這裡要介紹的是,如何透過 Linux 的 scp 指令來進行檔案複製。

在傳輸前,需要先定義主機的角色,通常會有一台是本機以及一台遠端機器,當然也可以是兩台遠端主機進行資料傳輸,並且你需要先知道遠端機器的 ssh 登入帳號及密碼,為了方便登入遠端主機,你也可將本機的 ssh public key 在遠端加入白名單。

Linux 上傳檔案基本語法

透過 scp copy 資料的基本結構如下:

scp <來源主機用戶帳號@來源主機>:<來源檔案位置> <目的主機用戶帳號>:<來源主機檔案目錄位置>

常見參數

  • -r 複製目錄以及內部所有檔案
  • -p 保留檔案的時間與權限
  • -C 壓縮資料
  • -4 透過 IPv4 進行傳輸
  • -6 透過 IPv6 進行傳輸
  • -P 自訂 port
  • -l 限制傳輸速度 (kbit/s)

以及

  • ssh_config 指定配用的用戶配置文件,傳遞給 ssh
  • -i identity_file: 讀取公鑰憑證文件傳輸給 ssh
  • -B 使用批次處理模式
  • -3 兩台主機透過副本方式傳輸,若沒有此選項會透過數據複製
  • -T 關閉嚴格檢查檔案名稱
  • -v 打印傳輸進度
  • -q 關閉警示提示及傳輸訊息

接下來我們來舉一些實際用法:

本地資料上傳到遠端主機:

這裡舉例,在本地資料夾位置為 /用戶資料夾/my_project/ 以及檔案為 allfile.zip,遠端資料夾位置為 /home/adam

scp ~/my_project/allfile.zip adam@192.168.77.100:/home/adam

如果遠端主機用戶與本地名稱相同,則可以將帳號省略

scp ~/my_project/allfile.zip 192.168.77.100:/home/adam

將遠端主機資料下載到本地

這裡舉例,在遠端資料夾位置為 /home/adam 以及檔案為 allfile.zip,本地資料夾位置為 /用戶資料夾/my_project/

scp adam@192.168.77.100:/home/adam/allfile.zip ~/my_project/

同樣,如果遠端主機用戶與本地名稱相同,則可以將帳號省略

scp 192.168.77.100:/home/adam/allfile.zip ~/my_project/

兩台遠端主機互傳檔案的範例:

將兩台主機資料進行檔案傳輸:

scp adam@192.168.77.100:/home/adam/myfile.zip adam@192.168.77.101:/home/adam

-r 複製目錄以及內部所有檔案

複製本地所有目錄以及內部所有檔案

scp -r ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

-p 保留檔案的時間與權限

有時我們需要保留檔案原始的建立時間以及修改時間,可以透過 -p

CVT2HUGO: 複製並且保留本地檔案時間與權限
scp -p ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

-C 壓縮資料

透過壓縮資料方式,可在傳輸前將資料進行壓縮再傳輸,可以減少傳輸的時間及頻寬:

scp -C ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

# 透過 IPv4, IPv6 進行傳輸

在 scp 使用 IPv4 進行資料傳輸

scp -4 ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

在 scp 使用 IPv6 進行傳輸

scp -6 ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

-P 自訂 port

通常,ssh 的連接 port 都是 22,如果變更為其他 port ,則可以透過 -P

CVT2HUGO: scp 上傳指定遠端主機的連接埠
scp -P 5566 ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

-l 限制傳輸速度 (kbit/s)

最後,如果傳輸的檔案較大,為了避免讓目的主機誤認為攻擊,則可以透過 -l

例如以下限制速度為 512 kbit,換算就是 512/8 = 64 KB/s

CVT2HUGO: 限制傳輸的速度,限制的單位是 kbit/s,
scp -l 512 ~/my_project/allfile/ adam@192.168.77.100:/home/adam/

大型檔案續傳

最後,對於較大型的檔案,在scp 可能會有中斷後就必須全部重來的問題,對於較大型的檔案,可以選擇用 rsync 來進行傳輸

例如

rsync -P -e ssh <user>@<host>:/path/bigfile <user>@<host>:/path/file

-P 是 –partial –progress 的縮寫

-e ssh 是 –rsh=ssh 的縮寫

關於 rsync ,後續我們在進行詳細的說明介紹。