查找:SSH命令中缺少“ -exec”的参数

时间:2019-05-16 14:36:37

标签: ssh find chmod

我正在CI / CD管道内使用SSH(因此它是非交互式的),并尝试执行一对find命令(以及其他命令)以在执行LFTP后更改文件和目录的所有权< em> mirror ,但我不断收到此错误(这会使整个管道失败):

find: missing argument to `-exec'

这是使用find的命令:

ssh -i ~/.ssh/id_rsa $USERNAME@$HOST "[other commands...]; find $SOME_PATH/ -type d -exec 'chmod 755 {} \;' && find $SOME_PATH/ -type f -exec 'chmod 644 {} \;' && echo Done"

我已经尝试过使用转义的双引号,例如:-exec \"chmod 755 {} \;\"-但总是抛出相同的错误。

这里的主要问题是什么?


编辑:已解决。。我删除了-exec的所有引号,删除了&&,并在每个;后面加了一个分号find。并按预期工作。

ssh -i ~/.ssh/id_rsa $USERNAME@$HOST "[other commands...]; find $SOME_PATH/ -type d -exec chmod 755 {} \;; find $SOME_PATH/ -type f -exec chmod 644 {} \;; echo Done"

因此请使用-exec whatever-command {} \;; [other command, echo, find, ls, whatever...]

请查看此答案以获取更多信息:https://unix.stackexchange.com/a/139800/291364

  

[...]当findexit指令后看到虚假的-exec … ;时,它不知道该怎么做;可能会(错误)猜测您将其作为遍历的路径。您需要一个命令分隔符:在;之后放置另一个\;(前面有空格也没有空格)。 [...]

2 个答案:

答案 0 :(得分:1)

在将字符串传递到远程外壳程序之前,将

\;处理为; local 。您需要转义反斜杠,以便;在远端保持转义。

ssh -i ~/.ssh/id_rsa $USERNAME@$HOST  \
    "[other commands...]; find $SOME_PATH/ -type d -exec 'chmod 755 {} \\;'
       && find $SOME_PATH/ -type f -exec 'chmod 644 {} \\;' && echo Done"

一个更好的主意是对命令参数使用单引号,并将$SOME_PATH的值作为参数传递给shell。

ssh -i ~/.ssh/id_rsa $USERNAME@$HOST \
  sh -c '...;
         find "$1" -type d -exec chmod 755 {} \; &&
         find "$1" -type f -exec chmod 644 {} \; &&
         echo Done' _ "$SOME_PATH"

请注意,chmod及其参数必须分别是find的独立参数。

实际上,您不需要运行find两次;您可以提供两个-exec原色,每个原色与不同的-type配对:

ssh -i ~/.ssh/id_rsa $USERNAME@$HOST \
  sh -c '...;
         find "$1" \( -type d -exec chmod 755 {} \; \) -o
                   \( -type f -exec chmod 644 {} \; \)
         && echo Done' _ "$SOME_PATH"

答案 1 :(得分:0)

除了使用复杂的find命令(以及相关的引号/转义混乱)外,您可以使用chmod符号模式的内置功能来不同地设置文件和导演的权限。具体来说,“ X”权限本质上是指“在有意义的情况下执行”,这主要是指目录而不是文件。主要的例外是,如果有一个已经设置了执行文件的文件,它将假定它是有意保留的。如果可以的话,您可以使用以下更简单的命令:

chmod -R u=rwX,go=rX "$1"    # Set non-executable files to 644, executables and directories to 755

如果您需要专门清除文件上的执行位,或者只是想坚持使用find,则另一个选择是利用chmod接受多个参数来使用find ... -exec ... {} +的事实\;版本。 “ +”不是壳元字符,因此不需要特殊处理:

find $SOME_PATH/ -type d -exec chmod 755 {} + ; find $SOME_PATH/ -type f -exec chmod 644 {} +