[英]Tar files from the latest changed directory via ssh
我試圖通過ssh將tar存檔,但我認為在此任務中沒有什么棘手的問題。 但是然后我需要從包含最近更改的目錄的路徑中壓縮tar文件。 為了得到這個,我正在使用這樣的命令:
cd "$(\ls -1dt ./*/ | head -n 1)"
整個命令如下所示:
ssh root@$ip "cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log" > $dir/out.tar
不幸的是我得到:
./Recent/:沒有這樣的文件或目錄
我試圖更改\\ls -1dt ./*/ | head -n 1
\\ls -1dt ./*/ | head -n 1
到\\ls -1dt /*/ | head -n 1
\\ls -1dt /*/ | head -n 1
然后我得到:
cd:dir3 /:沒有這樣的文件或目錄
我正在搜索/ dir1 / dir2 /中所有最近更改的dir目錄中的所有目錄都包含dir3目錄,這就是為什么以前的錯誤是不可能的。
另外,如果我通過ssh手動進入遠程計算機並逐個執行每個命令(不同的cd,搜索,tar),搜索將正確無誤地工作,但是在我的情況下,我需要“整個字符串”命令,因為它是只是我整個自動化腳本的一部分。
如何解決呢?
謝謝
您將提供給ssh
的命令用雙引號引起來,這會導致兩種不良行為:
您的直接問題是,本地外殼程序在將加引號的字符串傳遞給ssh
之前先對其進行擴展。 這樣,它將在本地執行子shell( $(ls ...)
),這很可能就是為什么遠程服務器抱怨找不到結果目錄的原因
您有兩個雙引號字符串和它們之間的子外殼。 只要subshell返回一個單詞就可以,但是如果它的結果包含多個單詞,您會突然向ssh
傳遞多個參數,這很可能會失敗
通過用單引號將希望遠程主機執行的命令括起來,可以解決/避免這兩個問題:
ssh root@$ip 'cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log' > $dir/out.tar
在這種情況下,您的本地外殼程序不會擴展該字符串,並且遠程主機將正確執行以下命令(在該命令中,它將擴展雙引號的部分,執行子外殼程序):
cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.