詳解Linux中scp命令的底層原理與實(shí)戰(zhàn)技巧
摘要:scp 是基于 SSH 協(xié)議的安全文件傳輸命令,無(wú)需額外配置即可在本地與服務(wù)器之間加密傳輸文件。本文從工作原理、基本用法(上傳/下載/雙服務(wù)器互傳)、性能優(yōu)化(壓縮、限速、加密算法、斷點(diǎn)續(xù)傳替代方案)、密鑰認(rèn)證配置,到底層協(xié)議細(xì)節(jié)、與 rsync/sftp 的對(duì)比,以及常見(jiàn)問(wèn)題排查,全面覆蓋 scp 的日常使用場(chǎng)景,幫你高效、安全地完成文件傳輸任務(wù)。
日常開(kāi)發(fā)中,我們經(jīng)常需要在本地和服務(wù)器之間傳文件。很多人習(xí)慣用 FTP 或者直接拖拽,但這些方式要么不安全,要么配置麻煩。scp(Secure Copy)可能是最簡(jiǎn)單也最靠譜的選擇——它基于 SSH 協(xié)議,加密傳輸,一條命令搞定。
scp 的工作原理
scp 的本質(zhì)是 SSH + 文件傳輸。它通過(guò) SSH 協(xié)議建立加密通道,然后在通道上傳輸文件數(shù)據(jù)。
┌────────┐ SSH 握手 ┌────────┐
│ 本地 │ ────────→ │ 遠(yuǎn)程 │
│ │ ←──────── │ │
│ │ 加密數(shù)據(jù) │ │
│ │ ────────→ │ │
└────────┘ └────────┘
整個(gè)過(guò)程分三步:
- SSH 握手:協(xié)商加密算法、交換密鑰
- 認(rèn)證:密碼或密鑰認(rèn)證
- 數(shù)據(jù)傳輸:文件數(shù)據(jù)在加密通道中傳輸
因?yàn)樽叩氖?SSH,所以你服務(wù)器上能 SSH 登錄,就能用 scp 傳文件,不需要額外裝任何東西。
基本用法
從本地傳到遠(yuǎn)程
# 傳單個(gè)文件 scp /local/path/file.txt user@remote:/remote/path/ # 傳整個(gè)目錄(加 -r 參數(shù)) scp -r /local/project/ user@remote:/remote/path/ # 指定端口(默認(rèn) 22) scp -P 2222 /local/file.txt user@remote:/remote/path/
注意:scp 的端口參數(shù)是大寫(xiě) -P,不是小寫(xiě) -p。小寫(xiě) -p 是保留文件屬性(時(shí)間戳、權(quán)限等)。這個(gè)坑很多人都踩過(guò)。
從遠(yuǎn)程拉到本地
scp user@remote:/remote/path/file.txt /local/path/ # 拉整個(gè)目錄 scp -r user@remote:/remote/project/ /local/path/
兩個(gè)遠(yuǎn)程服務(wù)器之間傳
scp user1@server1:/path/file.txt user2@server2:/path/
這個(gè)用法有個(gè)細(xì)節(jié):數(shù)據(jù)會(huì)先從 server1 下載到本地,再上傳到 server2。如果你在本地機(jī)器上執(zhí)行這條命令,帶寬會(huì)走兩次。如果兩個(gè)服務(wù)器之間網(wǎng)絡(luò)更快,可以 SSH 到其中一臺(tái)再執(zhí)行 scp。
性能優(yōu)化:大文件傳輸技巧
傳大文件時(shí),默認(rèn)參數(shù)可能不是最優(yōu)的。幾個(gè)實(shí)用技巧:
1. 啟用壓縮
scp -C large_file.tar.gz user@remote:/backup/
-C 參數(shù)啟用壓縮。對(duì)于文本文件、日志等可壓縮內(nèi)容,能顯著減少傳輸量。但如果已經(jīng)是壓縮格式(.gz、.zip、.mp4),再壓縮反而會(huì)增加 CPU 開(kāi)銷(xiāo),適得其反。
2. 限制帶寬
scp -l 10240 large_file.iso user@remote:/backup/
-l 參數(shù)限制帶寬,單位是 Kbit/s。10240 Kbit/s ≈ 1.25 MB/s。這在共享網(wǎng)絡(luò)環(huán)境下很有用,避免把帶寬跑滿(mǎn)影響其他服務(wù)。
3. 使用加密算法加速
SSH 默認(rèn)用 AES-256-GCM 加密,安全性高但速度不是最快的。如果在內(nèi)網(wǎng)傳輸,可以換用更快的算法:
scp -c aes128-ctr file.txt user@remote:/path/
aes128-ctr 比 aes256-gcm 快不少,內(nèi)網(wǎng)環(huán)境下安全性也夠用。
4. 斷點(diǎn)續(xù)傳
scp 本身不支持?jǐn)帱c(diǎn)續(xù)傳,傳到一半斷了就得重來(lái)。這時(shí)候可以用 rsync 替代:
rsync -avP --partial large_file.iso user@remote:/backup/
--partial 參數(shù)保留部分傳輸?shù)奈募?code>-P 等同于 --progress --partial。
密鑰認(rèn)證:告別密碼輸入
每次傳文件都要輸密碼很煩。配置 SSH 密鑰后可以免密:
# 1. 生成密鑰對(duì)(如果還沒(méi)有) ssh-keygen -t ed25519 # 2. 把公鑰傳到遠(yuǎn)程服務(wù)器 ssh-copy-id user@remote # 3. 之后 scp 就不需要密碼了 scp file.txt user@remote:/path/
ed25519 是目前推薦的密鑰算法,比傳統(tǒng)的 RSA 更短更快更安全。
底層實(shí)現(xiàn):scp 的協(xié)議細(xì)節(jié)
如果你好奇 scp 底層怎么工作的,這里簡(jiǎn)單說(shuō)一下。
scp 協(xié)議其實(shí)很簡(jiǎn)單,它復(fù)用了 SSH 的通道,在上面定義了一套文本協(xié)議:
C0644 1234 file.txt
<文件內(nèi)容>
C表示文件(directory 是D)0644是文件權(quán)限1234是文件大?。ㄗ止?jié))- 然后發(fā)送文件內(nèi)容
接收端解析這個(gè)頭部,分配對(duì)應(yīng)大小的緩沖區(qū),接收數(shù)據(jù)寫(xiě)入文件。
這也是為什么 scp 傳輸大文件時(shí)內(nèi)存占用不高——它是流式傳輸?shù)模恍枰颜麄€(gè)文件加載到內(nèi)存。
scp vs rsync vs sftp
很多人搞不清這三個(gè)命令的區(qū)別:
| 特性 | scp | rsync | sftp |
|---|---|---|---|
| 增量傳輸 | ? | ? | ? |
| 斷點(diǎn)續(xù)傳 | ? | ? | 部分 |
| 交互式操作 | ? | ? | ? |
| 傳輸效率 | 一般 | 高 | 一般 |
| 使用場(chǎng)景 | 臨時(shí)傳文件 | 同步/備份 | 瀏覽遠(yuǎn)程文件 |
簡(jiǎn)單原則:傳一兩個(gè)文件用 scp,同步大量文件用 rsync,需要交互式瀏覽用 sftp。
常見(jiàn)問(wèn)題排查
連接超時(shí)
scp: Connection timed out
檢查防火墻是否開(kāi)放了 22 端口,或者用 -P 指定正確端口。
權(quán)限拒絕
scp: Permission denied
確認(rèn)遠(yuǎn)程目錄有寫(xiě)權(quán)限,或者試試傳到用戶(hù)主目錄 ~/。
傳目錄報(bào)錯(cuò)
not a regular file
忘了加 -r 參數(shù)。傳目錄必須加 -r。
到此這篇關(guān)于詳解Linux中scp命令的底層原理與實(shí)戰(zhàn)技巧的文章就介紹到這了,更多相關(guān)Linux scp命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu下LAMP環(huán)境配置教程(linux)
這篇文章主要為大家詳細(xì)介紹了Ubuntu下LAMP環(huán)境配置教程,感興趣的小伙伴們可以參考一下2016-06-06
linux系統(tǒng)下安裝visdom包出現(xiàn)報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了linux系統(tǒng)下安裝visdom包出現(xiàn)報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Linux一個(gè)增強(qiáng)的截圖及分享工具:ScreenCloud
今天小編就為大家分享一篇關(guān)于Linux一個(gè)增強(qiáng)的截圖及分享工具:ScreenCloud,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10

