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 ,後續我們在進行詳細的說明介紹。