найти: отсутствует аргумент `-exec 'в команде SSH - PullRequest
0 голосов
/ 16 мая 2019

Я использую SSH внутри конвейера CI / CD (поэтому он неинтерактивный) и пытаюсь выполнить команду пары find (среди прочего), чтобы изменить владельца файлов и каталогов после выполнения LFTP 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"

I 'мы уже пытались использовать экранированные двойные кавычки, например, так: -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

[...] Когда find видит это поддельное exit после директивы -exec … ;не знает, что с этим делать;это опасно (неправильное) предположение, что вы подразумевали, что это путь для прохождения.Вам нужен разделитель команд: поставьте еще один ; после \; (с пробелом или без него).[...]

Ответы [ 2 ]

1 голос
/ 16 мая 2019

\; обрабатывается в ; локально перед передачей строки в удаленную оболочку.Вам необходимо избежать обратной косой черты, чтобы ; оставалось экранированным на удаленном конце.

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 какаргумент для оболочки.

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"
0 голосов
/ 18 мая 2019

Вместо сложных команд 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 {} +
...