簡體   English   中英

查找:ssh缺少-exec的參數

[英]find: missing argument to -exec with ssh

嘗試從服務器刪除目錄:

ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;

我嘗試用\\; \\;; ; "{}"-exec sh -c 'rm -r "{}"' \\;

所有得到的錯誤find: missing argument to "-exec'"

謝謝

當您要使用特殊字符時,使用ssh直接運行命令通常很難甚至不可能。 這是因為ssh遠程調用sh -c "<<COMMAND HERE>>" 這導致字符被引用兩次/取消引用兩次,有時甚至被刪除。

最好的選擇是在遠程系統上使用命令創建一個臨時文件並執行它:

echo 'find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} \;' > script
scp script myname@servera:
ssh myname@servera bash script

就您而言,可以使用find的-delete命令而不是-exec

@cbley是正確的,這樣做很棘手。 盡管如此,有時還是希望避免創建額外的文件。 如果是這樣,您可以這樣進行:

ssh myname@servera " \"${cmd}\" "  2>&1

其中$ cmd是您之前定義的整個命令:

cmd="find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;"

與其嵌套對ssh調用,不如使用-J選項並將命令作為單個參數發送,而不是將ssh必須連接在一起的一系列參數發送給命令。

ssh -J myname@servera othername@severb \
  "find /var/lib/jenkins/some/path/to/check -name '2.2.4*' -type d -exec rm -r {} \;"

這樣,您只需要擔心命令通過單個外殼傳遞即可。

謝謝你的幫助。 我的最終解決方案不是使用新腳本,而是臨時將其保存在數組中(這對我和bash技能似乎更容易):

dirArray=( $(ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d) )

for i in "${dirArray[@]}"
do
  echo "deleting $i"
  ssh myname@servera ssh othername@serverb rm -r $i
done

暫無
暫無

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

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