Установка программного обеспечения из всех подкаталогов

Первая строка имеет правильный синтаксис.

user1 ALL=(ALL) NOPASSWD: /etc/init.d/service-script

Это означает, что :user1 может на ВСЕХ хостах, использующих этот /etc/sudoersфайл, стать ВСЕМИ пользователями для запуска /etc/init.d/service-scriptбез запроса пароля.

Вторая строка имеет неверный синтаксис, по крайней мере, для современных версий sudo. Если вы редактировали /etc/sudoersс помощью рекомендуемой команды visudo, вы получите сообщение, похожее на это, после выхода из вашего любимого редактора:

File /etc/sudoers.tmp saved
>>> /etc/sudoers: syntax error near line 28 <<<
What now?

Набрав вопросительный знак, вы получите список опций:

Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

What now? 

Было бы лучше выбрать либо «e» и удалить неверную строку, либо «x», чтобы отменить все изменения, которые вы сделали на этот раз.

Вы можете ввести подобный комментарий в свой /etc/sudoersфайл, чтобы напомнить вам о правильном синтаксисе:

# WHO  WHERE = (AS WHOM) WHAT

Между частями (AS WHOM)и WHATвы можете дополнительно добавить несколько тегов с двоеточием -, заканчивающихся двоеточием, которые могут повлиять на некоторые детали процедуры.

Поскольку скрипт службы -находится в /etc/init.d, очевидно, он предназначен для запуска от имени пользователя root. Таким образом, «оптимальной» строкой /etc/sudoers будет:

user1 ALL=(root) NOPASSWD: /etc/init.d/service-script

Пользователь должен запустить его как:

sudo /etc/init.d/service-script

или явно

sudo -u root /etc/init.d/service-script

Добавление аргументов в конец командной строки разрешено.

1
30.04.2020, 19:34
1 ответ

Для перебора всех каталогов в текущем каталоге используйте более простой цикл:

for dir in./*/; do
   # more here
done

Шаблон ./*/будет соответствовать подкаталогам в текущем каталоге.

Использование find, скорее всего, приведет к неправильному результату, так как будет найдено подкаталогов в распакованных tarархивах.

Для каждого каталога $dirвы хотите cdвойти в этот каталог и выполнить сборку:

for dir in./*/; do
    ( cd "$dir" &&./configure && make && sudo make install )
done

Круглые скобки заставляют команды выполняться в подоболочке. Изменение каталога внутри подоболочки не будет отражено за пределами подоболочки, поэтому нет необходимости «cdназад».

Я связал команды с помощью&&("и" ). Это означает, что в случае сбоя одной команды последующие команды вообще не будут выполняться.

Вы не должны выполнять это с sudo, так как единственный шаг, который может возможно потребовать привилегий суперпользователя, — это шаг make install, который уже имеет префикс sudo.

Обратите внимание, что при этом по умолчанию будут установлены все проекты из /usr/local. Чтобы установить в другой префикс установки, используйте, например. --prefix=$HOME/localс configure(, что означает, чтоsudoвам вообще не понадобится , так как у вас уже есть права на запись в вашем домашнем каталоге ).

1
28.04.2021, 23:17

Теги

Похожие вопросы