如何在沒有臨時檔案的情況下透過 ssh 發送 .tar 存檔? tar 中的「-f -」選項是什麼?

如何在沒有臨時檔案的情況下透過 ssh 發送 .tar 存檔? tar 中的「-f -」選項是什麼?

如何透過 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.tartar -c將寫入存檔,tar -x並從中提取。-f -是一種特殊語法,意味著“寫入標準輸出”(如果創建)或“從標準輸入讀取”(如果提取)。

這允許tar在管道中使用。客戶端命令透過管道傳輸tarssh.在遠端,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

相關內容