議與落盤原理)
你可能早就用過rz也見過它在終端里打印出rz waiting to receive.***B0100000023be50這樣的握手信息。但很多人第一次用它時(shí)都會(huì)有同一個(gè)困惑文件明明顯示上傳成功去服務(wù)器目錄里卻找不到不知道它到底傳到哪去了。要回答這個(gè)問題需要把rz的協(xié)議原理、依賴環(huán)境、工作目錄規(guī)則和常見報(bào)錯(cuò)串成一條鏈路來理解。這篇內(nèi)容會(huì)從 Zmodem 協(xié)議講起給出 lrzsz 的安裝方法、常用參數(shù)、最小實(shí)操、完整校驗(yàn)流程再落到排查步驟和生產(chǎn)選型建議上。1. 先理解rz命令Zmodem 協(xié)議與文件傳輸場(chǎng)景1.1 rz 和 sz一對(duì)基于 Zmodem 的上傳下載命令rz并不是一個(gè)獨(dú)立的軟件它來自lrzsz軟件包。這個(gè)軟件包提供了兩個(gè)核心命令rz接收文件對(duì)應(yīng)英文 Receive。sz發(fā)送文件對(duì)應(yīng)英文 Send。這里的“接收”和“發(fā)送”要站在服務(wù)器視角來理解。你在本地終端里通過 SSH 登錄到遠(yuǎn)端 Linux 服務(wù)器然后在服務(wù)器上執(zhí)行rz表示服務(wù)器準(zhǔn)備接收來自本地終端的文件。終端軟件看到 Zmodem 握手后會(huì)彈出本地文件選擇窗口你選中文件后文件就從本地機(jī)器傳到服務(wù)器。反過來你在服務(wù)器上執(zhí)行sz 文件名終端會(huì)彈出另存為窗口把服務(wù)器文件下載到本地。二者都基于 Zmodem 協(xié)議。Zmodem 是早期調(diào)制解調(diào)器時(shí)代誕生的文件傳輸協(xié)議支持錯(cuò)誤檢測(cè)、斷點(diǎn)續(xù)傳和批量文件傳輸。SSH 時(shí)代并不直接需要它來做加密因?yàn)槲募?nèi)容是走 SSH 會(huì)話通道傳輸?shù)慕K端軟件只是把 Zmodem 的控制序列嵌入到終端輸出里再由本地端響應(yīng)。也就是說整個(gè)鏈路可以寫作本地終端Xshell/SecureCRT 等 | | SSH Zmodem 控制序列 v 遠(yuǎn)端 Linux 服務(wù)器lrzsz 提供 rz/sz 命令這個(gè)模型解釋了為什么rz的使用不像scp那么“純命令式”它依賴本地終端軟件配合而不是只靠一條命令完成全部操作。1.2 rz 解決什么場(chǎng)景不解決什么場(chǎng)景rz最合適的場(chǎng)景是臨時(shí)上傳幾個(gè)小文件。你正在終端里處理配置、排查問題突然需要把一個(gè).sql腳本或.tar.gz包傳到服務(wù)器又不愿意切換到 SFTP 客戶端這時(shí)rz是最順手的選擇。它不需要額外開通端口不需要記住遠(yuǎn)端路徑文件會(huì)直接落到你當(dāng)前所在的目錄。但rz不適合以下場(chǎng)景上傳大量目錄結(jié)構(gòu)比如整個(gè)前端構(gòu)建產(chǎn)物幾百個(gè)文件分布在多個(gè)子目錄里。無人值守的腳本任務(wù)rz依賴交互式終端和本地文件選擇窗口腳本里執(zhí)行很容易卡住。對(duì)可審計(jì)性、可回滾要求嚴(yán)格的發(fā)布流程生產(chǎn)環(huán)境不建議依賴終端軟件的人工選擇。理解這一點(diǎn)很重要。rz本質(zhì)上是給人用的交互式工具不是給腳本用的自動(dòng)化接口。2. 環(huán)境準(zhǔn)備安裝 lrzsz 并確認(rèn)終端支持 Zmodem 協(xié)議2.1 lrzsz 軟件包的安裝方法絕大多數(shù) Linux 發(fā)行版都可以通過包管理器安裝lrzsz。Debian/Ubuntu 系統(tǒng)使用 aptsudo apt update sudo apt install lrzsz -yCentOS/RHEL 7 或 8 使用 yumsudo yum install lrzsz -yCentOS/RHEL 9、Rocky Linux、Fedora 等使用 dnfsudo dnf install lrzsz -y安裝完成后先驗(yàn)證命令是否存在which rz which sz rz --version sz --version正常輸出里會(huì)包含類似rz (lrzsz) 0.12.20的版本信息。如果執(zhí)行rz提示command not found不要急著懷疑命令不存在先確認(rèn)是不是漏裝了軟件包。2.2 終端對(duì) Zmodem 的支持程度這是最容易踩坑的一步。遠(yuǎn)端服務(wù)器安裝了 lrzsz只意味著服務(wù)器端有了 Zmodem 接收能力本地終端還必須能識(shí)別 Zmodem 控制序列并把文件選擇窗口彈出來整個(gè)流程才能跑通。不同終端軟件的支持情況差異很大可以參考下表終端軟件是否原生支持 Zmodem實(shí)際使用說明Xshell支持連接屬性里可以配置上傳下載的默認(rèn)本地目錄SecureCRT支持Zmodem 集成比較成熟使用穩(wěn)定FinalShell支持同時(shí)提供圖形化文件管理但 rz 也可用MobaXterm支持不同版本實(shí)現(xiàn)有差異遇到問題先確認(rèn)版本PuTTY原生不支持默認(rèn)不能彈出 Zmodem 文件選擇框Windows Terminal WSL原生不支持直接執(zhí)行 rz 會(huì)卡在 waiting 狀態(tài)如果你使用 Window 系統(tǒng)推薦先用 Xshell、SecureCRT 或 FinalShell 這類帶 Zmodem 支持的客戶端。這樣在學(xué)習(xí)階段可以減少終端層面的干擾把注意力放在命令本身。2.3 安裝完成后如何驗(yàn)證在服務(wù)器執(zhí)行cd /tmp rz如果本地終端彈出文件選擇窗口說明 Zmodem 鏈路正常。如果窗口沒有彈出終端一直停留在rz waiting to receive狀態(tài)就需要回到本地終端的 Zmodem 配置上去排查而不是繼續(xù)在服務(wù)器端調(diào)試。3.rz命令常用參數(shù)和交互行為詳解3.1 基礎(chǔ)命令格式和啟動(dòng)流程rz的基礎(chǔ)用法非常簡(jiǎn)單rz執(zhí)行后終端輸出rz waiting to receive.***B0100000023be50這行輸出不是錯(cuò)誤而是 Zmodem 接收方的握手提示。支持 Zmodem 的終端會(huì)攔截這串序列并彈出本地文件選擇框選完文件后開始傳輸。如果這不是你要的效果檢查本地終端是否真正支持 Zmodem而不是糾結(jié)為什么這里沒有文件路徑。3.2 常用參數(shù)速查表rz的參數(shù)不算多但每個(gè)參數(shù)的選擇會(huì)影響文件完整性和使用體驗(yàn)。常用參數(shù)如下參數(shù)作用使用建議-y自動(dòng)覆蓋同名文件常用但生產(chǎn)環(huán)境要確認(rèn)不會(huì)覆蓋重要文件-b二進(jìn)制傳輸模式推薦用于壓縮包、可執(zhí)行文件、庫文件-aASCII 傳輸模式適合純文本可能轉(zhuǎn)換換行符-e對(duì)所有控制字符轉(zhuǎn)義和-b搭配使用更穩(wěn)定-E遇到重名文件時(shí)自動(dòng)跳過或重命名不同版本語義有差異落地前要實(shí)測(cè)-q安靜模式日志輸出場(chǎng)景可用-v詳細(xì)模式排錯(cuò)時(shí)使用參數(shù)組合時(shí)可以直接連寫比如rz -be rz -by rz -ey這里要特別注意不同版本的 lrzsz 對(duì)某些參數(shù)的處理略有差異尤其是-E。你不需要死記所有參數(shù)把它當(dāng)成一個(gè)備查表即可等真正遇到問題再回來查。3.3 rz -y 的覆蓋機(jī)制rz -y的-y表示在遇到同名文件時(shí)直接覆蓋不再等待用戶確認(rèn)。這個(gè)參數(shù)能加快操作但后果是原文件被替換后沒有自動(dòng)恢復(fù)機(jī)制。很多人因?yàn)榱?xí)慣性輸入rz -y上傳時(shí)不小心覆蓋了服務(wù)器上的同名文件等到發(fā)現(xiàn)時(shí)已經(jīng)找不到原始內(nèi)容了。建議的做法是上傳前在目標(biāo)目錄執(zhí)行l(wèi)s -l先確認(rèn)同名文件情況。重要目錄不要直接傳先傳到臨時(shí)目錄再移動(dòng)覆蓋。如果必須覆蓋上傳完整后立刻做一次校驗(yàn)而不是等到業(yè)務(wù)報(bào)錯(cuò)才發(fā)現(xiàn)。3.4 -a、-b、-e 的選擇邏輯-a是 ASCII 模式傳輸純文本時(shí)會(huì)把換行符轉(zhuǎn)換成適合目標(biāo)系統(tǒng)的格式。Windows 和 Linux 的換行符不同-a會(huì)做自動(dòng)轉(zhuǎn)換所以文本文件在-a模式下通常更友好。-b是二進(jìn)制模式不做任何轉(zhuǎn)換字節(jié)原樣傳輸。對(duì).tar.gz、.zip、.jar、.so、數(shù)據(jù)庫備份文件一定使用-b否則二進(jìn)制內(nèi)容可能被換行符轉(zhuǎn)換破壞傳上去的文件打不開。-e是對(duì)控制字符做轉(zhuǎn)義降低終端把文件內(nèi)容誤認(rèn)為控制序列的風(fēng)險(xiǎn)。實(shí)際項(xiàng)目中如果你不確定文件類型或者要傳輸比較大、比較復(fù)雜的文件直接用rz -be這樣既保證二進(jìn)制原樣傳輸又減少控制字符干擾比裸rz更穩(wěn)妥。不過也要說明-e會(huì)略微增加傳輸數(shù)據(jù)量但在現(xiàn)代網(wǎng)絡(luò)環(huán)境下這點(diǎn)開銷通常可以忽略。4. 最小實(shí)操用rz上傳文件并校驗(yàn)完整流程4.1 準(zhǔn)備目標(biāo)目錄和文件在服務(wù)器上創(chuàng)建一個(gè)專門用于上傳的目錄并進(jìn)入目錄mkdir -p /tmp/upload cd /tmp/upload pwd這一步的目的是讓上傳行為可控。如果你一登錄就執(zhí)行rz文件會(huì)落到用戶主目錄時(shí)間久了目錄會(huì)變得雜亂。先在臨時(shí)目錄里操作至少能確認(rèn)文件被傳到了哪里。4.2 執(zhí)行 rz 并選擇文件在/tmp/upload目錄下執(zhí)行rz -be本地終端彈出文件選擇窗口后選擇需要上傳的文件比如app.tar.gz。等待終端提示傳輸完成。如果本地文件比較大傳輸過程可能會(huì)持續(xù)一段時(shí)間不要中途關(guān)閉終端窗口。如果你確定目標(biāo)目錄沒有同名文件或者希望直接覆蓋舊文件可以使用rz -be -y4.3 用命令驗(yàn)證上傳結(jié)果傳輸完成后不要只看“成功”提示要用命令確認(rèn)落盤文件和文件完整性。先查看文件是否存在ls -l /tmp/upload再用file命令判斷文件類型file /tmp/upload/app.tar.gz最后計(jì)算校驗(yàn)值md5sum /tmp/upload/app.tar.gz在本地機(jī)器上執(zhí)行對(duì)應(yīng)的 md5 計(jì)算對(duì)比兩邊的摘要值。如果一致說明文件確實(shí)完整傳輸網(wǎng)絡(luò)或終端沒有引入損壞。校驗(yàn)這一步是排查問題的關(guān)鍵技巧之后遇到rz傳完打不開的文件第一個(gè)反應(yīng)就應(yīng)該是對(duì)比哈希值。5. “上傳的文件去哪了”工作目錄、查找方法和落盤驗(yàn)證5.1 當(dāng)前工作目錄決定落盤位置這是搜索熱度非常高的問題rz上傳的文件在哪。答案很簡(jiǎn)單rz把文件保存到執(zhí)行命令時(shí)所在的當(dāng)前工作目錄而不是某個(gè)固定目錄也不保留本地文件路徑信息。你本地文件在D:\project\config\application.yml傳到服務(wù)器后它會(huì)變成服務(wù)器當(dāng)前目錄下的application.yml而不是自動(dòng)創(chuàng)建config子目錄。這個(gè)行為對(duì)很多人來說是反直覺的但它就是 Zmodem 接收器的默認(rèn)工作方式。驗(yàn)證方式pwd rz你在哪個(gè)目錄執(zhí)行rz文件就在哪個(gè)目錄。終端提示上傳成功后立刻用ls -lt | head查看最近修改的文件一般都能找到。5.2 文件找不到時(shí)從哪個(gè)路徑查當(dāng)你上傳后找不到文件按下面的順序排查執(zhí)行pwd查看當(dāng)前工作目錄。如果剛登錄服務(wù)器沒有執(zhí)行過cd文件一般在用戶主目錄下root 用戶是/root普通用戶是/home/用戶名。檢查是否在多個(gè)終端窗口里執(zhí)行過命令會(huì)不會(huì)上傳到了另一個(gè)窗口對(duì)應(yīng)的會(huì)話目錄。查找最近 10 分鐘內(nèi)修改過的文件find ~ -maxdepth 3 -mmin -10 -type f -exec ls -lh {} \;這條命令會(huì)列出用戶主目錄三層以內(nèi)最近 10 分鐘生成的文件通常能快速定位剛上傳的文件。5.3 重名文件的后綴行為不帶-y參數(shù)時(shí)如果目標(biāo)目錄已經(jīng)存在同名文件rz會(huì)詢問怎么處理有的版本會(huì)生成類似file.0、file_1的重名文件有的版本會(huì)提示選擇“覆蓋”或“跳過”。這個(gè)行為受終端和 lrzsz 版本雙重影響不統(tǒng)一也不要在腳本里依賴它。更可靠的做法是在上傳前主動(dòng)控制目錄狀態(tài)清空臨時(shí)目錄或者把同名文件先改名。這樣無論參數(shù)行為如何你都能預(yù)判文件最終叫什么。6. 常見失敗現(xiàn)象、原因與排查路徑6.1 命令不存在現(xiàn)象-bash: rz: command not found原因服務(wù)器沒有安裝 lrzsz 軟件包。處理按第 2 節(jié)安裝對(duì)應(yīng)發(fā)行版的包安裝后重新執(zhí)行rz --version驗(yàn)證。6.2 終端卡在 waiting 狀態(tài)現(xiàn)象rz waiting to receive.***B0100000023be50然后一直沒有任何反應(yīng)本地也不彈文件選擇窗口。原因本地終端不支持 Zmodem或者終端的 Zmodem 功能被禁用了。檢查方式確認(rèn)使用的終端軟件是否支持 ZmodemPuTTY 和 Windows Terminal 原生不支持。查看 Xshell、SecureCRT 的連接屬性或文件傳輸配置看 Zmodem 相關(guān)選項(xiàng)是否被關(guān)閉。處理方式更換支持 Zmodem 的終端或者放棄rz改用scp。6.3 庫文件、大文件傳輸失敗或中斷現(xiàn)象上傳.so庫文件、幾十 MB 以上的安裝包時(shí)傳輸中途卡住或者傳完后文件無法使用終端提示傳輸失敗。原因使用了 ASCII 傳輸模式二進(jìn)制內(nèi)容被換行符轉(zhuǎn)換破壞。本地終端對(duì) Zmodem 大文件的緩沖和超時(shí)設(shè)置不合適。網(wǎng)絡(luò)不穩(wěn)定Zmodem 重傳超時(shí)后客戶端沒有正確處理。服務(wù)器磁盤空間不足或 inode 耗盡。檢查方式df -h df -i處理方式使用rz -be重試。大文件先壓縮再傳或者拆分成多個(gè)分片。生產(chǎn)環(huán)境直接使用scp或rsync不要依賴終端 Zmodem 傳輸大文件。6.4 上傳后文件為空或亂碼現(xiàn)象文件傳上去了也有正確文件名但打開內(nèi)容是亂碼或者file命令識(shí)別不出類型。原因rz使用了-aASCII 模式把二進(jìn)制文件里的部分字節(jié)轉(zhuǎn)換掉了。Windows 和 Linux 的 CRLF 換行差異是常見觸發(fā)因素。處理刪除服務(wù)器上的文件使用rz -b重新上傳然后對(duì)比兩端md5sum。6.5 權(quán)限不足導(dǎo)致的寫入失敗現(xiàn)象上傳時(shí)提示 permission denied或者傳輸結(jié)束后目標(biāo)位置沒有出現(xiàn)文件。原因當(dāng)前用戶沒有目標(biāo)目錄的寫權(quán)限。檢查方式ls -ld /tmp/upload處理方式切換到有權(quán)限的目錄或者調(diào)整目錄權(quán)限。如果你使用 sudo 執(zhí)行rz要注意 sudo 會(huì)把當(dāng)前工作目錄帶到 root 環(huán)境實(shí)際落盤位置可能變成/root。更好的寫法是sudo bash -c cd /目標(biāo)目錄 rz這樣可以保證文件進(jìn)入預(yù)期目錄同時(shí)以 root 權(quán)限完成寫入。6.6 排查順序清單遇到rz相關(guān)問題時(shí)建議按這個(gè)順序排查確認(rèn)rz命令是否存在。確認(rèn)終端是否支持 Zmodem。確認(rèn)pwd明確當(dāng)前工作目錄。確認(rèn)目標(biāo)目錄有寫權(quán)限。確認(rèn)文件沒有損壞使用file和md5sum。檢查磁盤空間、網(wǎng)絡(luò)穩(wěn)定性、終端傳輸配置。如果問題依舊換scp或rsync先保證業(yè)務(wù)能繼續(xù)。7. 什么時(shí)候不該用rz選型對(duì)比和生產(chǎn)建議7.1 rz/sz 與 scp、sftp、rsync 的對(duì)比工具交互性適合場(chǎng)景主要限制rz/sz交互式小文件臨時(shí)上傳下載依賴終端支持難以自動(dòng)化scp命令式單文件、多文件直接傳輸不支持增量同步和斷點(diǎn)續(xù)傳sftp交互式/命令式文件管理、上傳下載比 rz 通用適合腳本集成rsync命令式大量文件、目錄同步上手成本略高但適合生產(chǎn)rz的優(yōu)勢(shì)是方便劣勢(shì)則是自動(dòng)化能力弱。你在終端里操作時(shí)它很好用但一旦要放到 CI/CD 流水線、定時(shí)任務(wù)或無人值守腳本里rz就基本不適合了。7.2 生產(chǎn)環(huán)境的上傳推薦生產(chǎn)環(huán)境上傳文件時(shí)優(yōu)先考慮以下方式一次性發(fā)布包使用scp上傳例如scp app.tar.gz userserver:/data/release/。大量文件同步使用rsync -avz --progress --partial支持?jǐn)帱c(diǎn)續(xù)傳和增量同步。需要批量交互使用sftp腳本可用-b參數(shù)指定命令文件。涉及對(duì)象存儲(chǔ)或云環(huán)境使用云廠商 CLI 工具把文件先傳到 OSS/S3再從服務(wù)器端拉取。這些方式比rz更適合記錄日志、控制權(quán)限和接入流水線。學(xué)習(xí)rz的目的是理解它在方便場(chǎng)景下的價(jià)值而不是把它當(dāng)成生產(chǎn)環(huán)境的萬能上傳工具。7.3 自動(dòng)化腳本中的 rz 注意事項(xiàng)不要在無人值守腳本里直接執(zhí)行rz。rz依賴交互式 TTY 和本地終端的 Zmodem 支持腳本環(huán)境下它通??ㄔ趙aiting to receive直到超時(shí)既不完成傳輸也不退出。如果腳本確實(shí)需要從本地傳輸文件到服務(wù)器改寫為scp或rsync更可靠。例如scp -i ~/.ssh/id_rsa app.tar.gz deploytarget:/opt/app/如果用rsyncrsync -avz --partial app.tar.gz deploytarget:/opt/app/這樣的命令可記錄、可重試、可監(jiān)控也方便接入日志系統(tǒng)。7.4 安全審計(jì)和文件完整性建議即使你選擇使用rz也要注意幾點(diǎn)不要讓用戶直接在業(yè)務(wù)目錄執(zhí)行rz最好先上傳到專用臨時(shí)目錄比如/tmp/upload確認(rèn)文件名和校驗(yàn)值后再移動(dòng)到目標(biāo)位置。上傳后執(zhí)行sha256sum或md5sum與本地比對(duì)避免只憑“傳輸成功”提示做判斷。對(duì)上傳目錄的權(quán)限進(jìn)行控制避免所有用戶都能寫入尤其是 web 服務(wù)可讀寫目錄防止文件被替換。不要把rz包裝成無人值守服務(wù)來使用它本來就是終端交互工具不適合作為系統(tǒng)級(jí)上傳通道。8. 擴(kuò)展閱讀從rz延伸到常用 Linux 命令的學(xué)習(xí)方法rz只是眾多 Linux 命令中的一條但它能反映出一個(gè)學(xué)習(xí)思路一條命令不是一個(gè)孤立的單詞而是由協(xié)議、依賴、參數(shù)、目錄規(guī)則和替代方案組成的一整條鏈路。學(xué)習(xí)rz時(shí)你會(huì)接觸到 lrzsz 軟件包、Zmodem 協(xié)議、終端支持程度、pwd目錄定位、md5sum校驗(yàn)、scp/rsync文件傳輸對(duì)比這些知識(shí)在運(yùn)維和日常開發(fā)中都會(huì)反復(fù)使用。如果你打算繼續(xù)深入可以按下面路徑練習(xí)在測(cè)試服務(wù)器上執(zhí)行rz -be和rz --help把參數(shù)表過一遍。上傳一個(gè)文本文件和一個(gè)二進(jìn)制文件分別觀察-a與-b的區(qū)別。用md5sum和file驗(yàn)證上傳結(jié)果。用scp和rsync完成同樣的文件傳輸對(duì)比使用體驗(yàn)。把兩條命令放進(jìn)腳本確認(rèn)rz在非交互環(huán)境下確實(shí)不適用而scp和rsync可以穩(wěn)定運(yùn)行。對(duì)初學(xué)者來說最重要的不是背下所有選項(xiàng)而是養(yǎng)成“命令執(zhí)行后如何驗(yàn)證”的習(xí)慣。以后無論使用rz、scp還是rsync都會(huì)先考慮文件最終落在哪、權(quán)限是否正確、內(nèi)容有沒有損壞、日志能不能追蹤到。這就是比記住一條命令更有價(jià)值的工程能力。