如何透過 ssh 使用 tar 指令壓縮和解壓存檔,而不建立臨時檔案:
我有一個例子:
腳本客戶端.sh
#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh
腳本伺服器.sh
#!/bin/bash
tar -x -C ~/backups/ -f -
這些程式碼片段不是我的,我不明白-f -
tar 指令是如何運作的,手冊頁毫無用處。
答案1
使用-f archive.tar
,tar -c
將寫入存檔,tar -x
並從中提取。-f -
是一種特殊語法,意味著“寫入標準輸出”(如果創建)或“從標準輸入讀取”(如果提取)。
這允許tar
在管道中使用。客戶端命令透過管道傳輸tar
到ssh
.在遠端,SSH 伺服器運行./ScriptServer.sh
並將傳入流推送到其標準輸入。tar -f -
腳本內部讀取該流。
你是對的,這-f -
沒有記錄在案man 1 tar
(至少在我讀過的手冊中)。如果沒有-f
該工具,無論如何都應該使用 stdout 或 stdin。很少有其他工具支援-
作為特殊的「檔案名稱」來明確指向 stdout 或 stdin;我想對-f -
in的支持tar
只是對這個半標準的遵守。
答案2
我不明白
-f -
tar 指令是如何運作的,手冊頁毫無用處。
man
您正在查看哪個頁面?是透過系統的命令列man tar
還是其他方式?檢查此線上手冊頁tar
——還有正如這個— 顯示以下內容:
-f, --file=ARCHIVE
use archive file or device ARCHIVE
所以-f
會從特定檔案讀取輸入......但是之後是-
什麼-f
?它肯定不是一個文件。這基本上是一個特殊字符,告訴命令(在本例中)從(標準輸入)獲取資料stdin
……它stdin
來自第一個腳本,透過管道將輸出|
透過 SSH 傳輸到目標上的接收腳本。
答案3
這是一個沒有在接收方建立腳本的範例。透過未壓縮流將檔案從本機傳輸到遠端 UNIX:
LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"
cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"
POSIX Tar 不壓縮文件,僅連接。您也可以透過這種方式添加輕壓縮
tar -cf - "$LocalFile" | gzip -1 | \
ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"
由於傳輸時間較長,我不建議您添加深度壓縮。
如果你想要單行,這裡是:
tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"
已測試將檔案從 RHEL6 傳輸到 Solaris11,以及從 Solaris 向後傳輸到 RHEL。
答案4
第一個指令「tar -cf -」將建立 tar 到標準輸出 (stdout),而不是常規檔案。
這將透過 ssh 作為標準輸入發送,並由伺服器腳本使用。
也可以看看 :https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/和https://www.linuxjournal.com/content/working-stdin-and-stdout