
當您擁有的只是一個序列控制台(例如透過終端伺服器透過 telnet)時,可以使用哪些方法將檔案傳入/傳出主機?
剪下/貼上適用於小/可列印的內容,我已經使用 uuencode/uudecode (帶有 gzip)的組合來處理不可列印的內容,但這都是非常有限的。
答案1
您將在連接另一端使用的串行控制台程式將透過某種方式將檔案傳送到遠端。具體如何進行取決於遠端系統上有哪些可用資源。
我有lrzsz
或kermit
在遠端
最簡單的情況是,如果您在遠端安裝了可靠的二進位檔案傳輸程序,例如lrzsz
或者kermit
。這曾經比今天更常見,但您的特定係統可能仍然有其中之一。
您在本機上使用的串行控制台程式幾乎肯定有一種方法可以進行 Zmodem 或 Kermit 上傳,這樣您就可以直接發送您需要的任何內容。
對於 Zmodem,只需rz
在遠端系統上鍵入,該系統會發出本機串列終端應該理解的特殊字串,從而彈出一個檔案選擇器對話框。
Kermit 是一個更簡單的協議,因此在這種情況下您必須手動啟動傳輸。
我沒有二進位檔案傳輸程序,但我有uuencode
/base64
lrzsz
使用適當的二進位檔案傳輸程式(如或 )有幾個優點kermit
:效率、校驗和、自動重試、中止的傳輸復原、多個檔案傳輸等,但這些是奢侈品。如果您只需要傳送一個文件,或者您很少傳送文件,則可以使用 ASCII 上傳。
因為終端協議解釋二進位資料檔案中出現的許多位元組值,您不能直接透過相同連線傳送檔案;如果這樣做,任一端的終端仿真程式碼將嘗試解釋某些數據,從而損壞數據並可能令人困惑的以及終端處理代碼。
您可以透過在本機上將二進位資料編碼為 ASCII 的安全性子集,然後在遠端將其轉換回原始二進位資料來解決此問題。這就是uuencode
和base64
程式確實如此,僅在較小的演算法選擇上有所不同。
在本機系統上,您對文件進行編碼:²
$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz
然後,您在遠端系統上鍵入此命令,並使用本機序列控制台的「ASCII 上傳」功能傳送檔案:
$ cat | uudecode
文件上傳完成後,點選Ctrl-C退出cat
。現在,您已根據需要在遠端系統上取得了解碼後的檔案。
但我有許多要傳送的檔案和可列印的 ASCII 轉碼很痛苦!
讓自己達到更高的技術水準並不難。如果遠端系統具有 C 編譯器,則可以使用現有技術向遠端系統傳送原始程式碼的副本lrzsz
。在本地端:
$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz
然後在遠端系統上,透過序列控制台程式鍵入:
$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally
啟動第一個指令後,將檔案「ASCII 上傳」lrzsz.tgz.uue
到遠端系統。該管道接受 uuencoded 數據並將其解碼為二進位 tarball,您可以解壓縮並建立它。
但我在遠端系統上沒有 C 編譯器
如果遠端系統上甚至沒有編譯器,您可以交叉編譯rz
本地系統上的(或其他)程式並使用上述技術將其發送到遠端系統。
註腳:
答案2
基本上,您必須使用預先互聯網方法透過串行 tty 進行傳輸,並且您必須有一種方法在另一端接收傳輸。顯然,最好的方法是使用 ZMODEM,這意味著您需要有一個類似於sz
接收端已有的工具。然而,這並不總是可行,例如,當接收目標是沒有網路的路由器時。
執行此傳輸的唯一可能方法是直接通過通道,使用終端安全 ASCII,採用前 8 位元乾淨風格。我將使用更現代的工具,我希望大多數系統上都安裝了這些工具。
寄件者:
首先我們對文件進行編碼
base64 file.tar.gz > file.tar.gz.b64
現在確保您的 com 發送文件命令是,ascii-xfr
這是我的連接命令行
picocom -f n -p n -d 8 -b 115200 --send-cmd "ascii-xfr -snv" /dev/ttyS0
通常我們需要ascii-xfr
接收端,但由於我們沒有它,因此-n
可以透過保持正確的行結尾來解決這個問題。
接收者:
現在我們已經連接,請轉到您想要接收檔案的目錄。
cd /tmp/
cat > file.tar.gz.b64
在picocom上,我只是CTRL+a+s,然後輸入我要傳送的文件的完整路徑。傳輸完成後,您需要CTRL+C打破這一點cat
。
現在我們解碼文件,
base64 -d file.tar.gz.b64 > file.tar.gz
盡一切努力驗證該文件與您發送的文件是否相同,因為 ASCII 傳輸沒有校驗和保護。我的接收盒有sha512sum
,但任何校驗和命令就足夠了。一旦您手動確認金額匹配,您就可以認為轉帳成功了!
答案3
不知道如果您只有一個串行控制台,這是否可行,但如果您有網路存取權限,那麼您可以nc(1)
使用 TCP/IP 來複製檔案。
# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675
在上面的範例中,我sdbYYY
從來源框複製到sdaXXX
目標框。我選擇 8675 作為 TCP 連接埠號碼是任意的;您可以使用您有權存取的任何連接埠。它不一定是一個設備;它也可以是一個設備。它可以是任何文件。
[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345
在第二個範例中,我複製了 rsa 公鑰 ( ~/.ssh/id_rsa.pub
) 並將其新增至目標主機的授權金鑰檔案。
答案4
我會用克米特,文件傳輸程式的祖父母。早在 Linux 出現之前我們就已經使用它了。