Первая строка имеет правильный синтаксис.
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
Добавление аргументов в конец командной строки разрешено.
Для перебора всех каталогов в текущем каталоге используйте более простой цикл:
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
вам вообще не понадобится , так как у вас уже есть права на запись в вашем домашнем каталоге ).