[英]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.