簡體   English   中英

通過 SSH 遠程創建壓縮 tar 文件,僅包含文件子集

[英]Creating compressed tar file, with only subset of files, remotely over SSH

我已經成功地從遠程系統的標准輸出上通過 SSH 傳輸了一個 tar 文件,通過執行以下操作在本地創建一個壓縮文件:

read -s sudopass
ssh me@remote "echo $sudopass | sudo -S tar cf - '/dir'" 2>/dev/null | XZ_OPT='-6 -T0 -v' xz > dir.tar.xz

正如預期的那樣,這讓我在本地獲得了一個dir.tar.xz ,它是所有遠程/dir壓縮的。

我還設法弄清楚如何在本地僅壓縮文件的子集,方法是在 STDIN 上使用-T將文件列表傳遞給tar

find '/dir' -name '*.log' | XZ_OPT='-6 -T0 -v' tar cJvf /root/logs.txz -T -

我的主要問題是:我將如何 go 做第一件事(遠程傳輸普通 tar,然后在本地壓縮),同時告訴tar我只想對特定的文件子集執行此操作?

當我嘗試將兩者結合時:

ssh me@remote "echo $sudopass | sudo -S find '/dir' -name '*.log' | tar cf
-T -" | XZ_OPT='-6 -T0 -v' xz > cypress_logs.tar.xz

我收到如下錯誤:

tar: -: Cannot stat: No such file or directory

我覺得tar不喜歡這樣一個事實,即我既在 STDIN 上傳遞了一些東西,又期望它到 output 到 STDOUT。 添加另一個-似乎也沒有幫助。

另外,作為一個額外的問題,如果有人對如何通過$sudopass以上有更好的想法,那將是很好的,因為這種方法 - 同時避免在 bash 歷史記錄中使用密碼 - 使 sudo 密碼顯示在過程中運行時列出。

請記住, f選項需要一個參數,因此當您編寫cf -T -時,我懷疑-T被用作f的參數,這會拋出命令行的 rest。

這對我有用:

ssh me@remote "echo $password | sudo -S find /tmp/dir -name '*.log' | tar -cf- -T-"

你也可以這樣寫:

ssh me@remote "echo $password | sudo -S find /tmp/dir -name '*.log' | tar cf - -T-"

但我更喜歡總是使用-作為選項,而不是沒有任何前綴的遺留 tar 的奇怪選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM