透過 ssh 發送資料夾然後壓縮並發回

透過 ssh 發送資料夾然後壓縮並發回

我需要將包含 eml 檔案的資料夾從“A”發送到“B”,然後用 7z 壓縮它們並發送回“A”,我所擁有的是

ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z

但它會產生 tar.7z,所以我需要在創建 7z 檔案之前解壓縮 tar 如何實現?

附:由於 ram 和 cpu 太少,我無法將它們壓縮到“A”上

答案1

我向你保證它很難看,但我測試過,它可以在我的 Linux 機器上運行。

假設:您只想備份一個資料夾(這不會輕易適應多個資料夾)並且您相信您不會覆蓋客戶端上的任何內容。該資料夾位於遠端伺服器的主目錄中。您可能想要為 ssh 設定無密碼身份驗證,否則您將不得不輸入密碼兩次。

警告:此操作的完成方式可能存在特定於作業系統的怪癖。例如,如果您執行 crontab 操作,您可能會想要使路徑更具體。也許您使用的是 BSD,所以bash預設情況下您可能沒有。我使用 date 命令建立一個唯一的檔案名稱以上傳回伺服器,但這在不同的主機中可能會有所不同。儘管很容易添加到腳本中,但這裡也沒有錯誤檢查。

我創建了一些變數來簡化事情。 $cssh 變數使我不必重複 ssh 連接字串。請注意,我將您的資料夾名稱更改為 test/,但由於它僅使用一次,因此我沒有將其放入變數中。

我將其全部包裝在bashor sh(通常它們在 Linux 上可以互換)以使抑制輸出變得容易,但如果您不關心抑制輸出,您可以刪除它並使其長度稍微短一些。

bash -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder' > /dev/null 2>&1

如果使用ssh是硬性要求,且您不希望使用,scp則可以使用dd透過 ssh 複製檔案:

sh -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && dd if=$file | ssh $cssh "dd of=$file" && rm $file && rm -r $folder' > /dev/null 2>&1

在將存檔串流傳輸到本機之前,我對檔案進行了 gzip 壓縮,因為這樣可以使用純文字檔案節省大量頻寬。您可以刪除管道 to gzip -9c,但如果您這樣做,則需要刪除本機上相應的解壓縮gzip -d

或將第一個命令放入腳本中以使其更清晰:

#!/bin/sh

# make a unique file name to temporarily use for storing 7z'd folder
# will look something like bu2019-09-29-00h18m49s_Sunday.7z
file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; 

# SSH connection strong
cssh="user@host"; 

# downloads the remote folder and gets the name of the folder in one variable
folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`;

# compress, upload, remove folder, remove file
7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder

相關內容