查找:使用 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

在您的情况下,您可以使用查找的 -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 {} \;"

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

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