find:使用ssh缺少-exec参数

时间:2018-06-14 10:38:49

标签: linux bash ssh exec

尝试从服务器中删除目录:

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'"

由于

4 个答案:

答案 0 :(得分:1)

当您想使用特殊字符时,通常很难用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

答案 1 :(得分:1)

@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 {} ;"

答案 2 :(得分:1)

不是将调用嵌套到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 {} \;"

这样,您只需担心命令通过单个shell。

答案 3 :(得分:0)

感谢您的帮助。 我的最终解决方案不是使用新脚本,我只是暂时将其保存在一个数组中(对我和我的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