Это довольно сложный вопрос, связанный с файлом Sudoers и командой sudo в целом.
ПРИМЕЧАНИЕ. Я внес эти изменения на выделенной машине с Ubuntu Desktop 13.04, которую я использую исключительно в учебных целях. Я понимаю, что активировать NOPASSWD sudo - огромный риск для безопасности.
Изначально мое единственное изменение в файле sudoers (/ etc / sudoers) было одной строкой, пользовательской спецификацией, которая должна была позволить nicholsonjf запускать все команды с sudo без необходимости вводить пароль (см. строку, начинающуюся с 'nicholsonjf'):
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
nicholsonjf ALL=NOPASSWD: ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
Однако это не сработало, и мне все равно предлагали ввести пароль каждый раз, когда я запускал команду как nicholsonjf. Я смог запустить команды sudo только как nicholsonjf, как только удалил nicholsonjf из групп sudo и admin.
Кто-нибудь может объяснить, почему это сработало?
Это потому, что пользователь 'nicholsonjf' наследовал права sudo от двух групповых спецификаций 'admin' и 'sudo' (см. Ниже в sudoers file), которые переопределяли пользовательскую спецификацию 'nicholsonjf', потому что они находились в файле конфигурации?
Ваша добавленная строка была переопределена. Из man sudoers
:
Когда для пользователя совпадают несколько записей, они применяются по порядку. При наличии нескольких совпадений используется последнее совпадение (которое не обязательно является наиболее конкретным совпадением).
blockquote>В вашем случае
nicholsonjf
был членом группыsudo
, поэтому к нему применилась эта строка:%sudo ALL=(ALL:ALL) ALL
Если вы хотите переопределить записи в
/etc/sudoers
, просто поставьте новые записи после них.Новая запись должна выглядеть как
myuser ALL=(ALL) NOPASSWD:ALL
для одного пользователя или
%sudo ALL=(ALL) NOPASSWD:ALL
для группы.
Для одного пользователя:
superuser ALL=(ALL) NOPASSWD:ALL
Для группы:
%supergroup ALL=(ALL) NOPASSWD:ALL
Поскольку Винс упомянул в комментарии , вы можете использовать эту строку:
%sudo ALL=NOPASSWD: ALL
(Это отличается от строк, показанных в те ответы , и это решило проблему для меня.)
Никогда не предлагать текущему пользователю пароль, когда тот пользователь использует sudo
сделать
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-password
это создаст названный файл /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password
и будет означать, что пользователь, что Вы выполнили ту команду, как не будет запрошен их пароль при выполнении sudo
команда. Вам все еще предложат пароль в других контекстах, таких как установка материала из программного обеспечения Ubuntu графическое приложение.
Преимущества выполнения его этот путь по включению строки echo
команда к /etc/sudoers
использование sudo visudo
(как предложено другими ответами),
/etc/sudoers
иногда изменяется системными обновлениями, тогда как файлы в /etc/sudoers.d
неsudo visudo
метод подвержен ошибке (как свидетельствуется этим самым вопросом), тогда как копию/вставку команда намного более трудно испортитьСогласно sudo cat /etc/sudoers.d/README
эта функция (вставления дополнительных sudoer файлов /etc/sudoers.d
) был включен по умолчанию начиная с Debian 1.7.2p1-1, который вышел в конце 1990-х (Ubuntu основана на Debian).
Изучая это, я понял, что в файле / etc / sudoers
есть строка, которая является не комментарием, а директивой , который заставляет любой файл или папку в каталоге / etc / sudoers / *
переопределять содержимое / etc / sudoers
.
Это маленькая хитрая директива, так как на первый взгляд кажется, что это прокомментированная строка. Это выглядит так:
#includedir /etc/sudoers.d
Вот как я реализовал пользователя без полномочий root и без пароля в эфемерном образе Docker для использования в конвейере CICD с базовым образом ubuntu: 18.04:
RUN \
useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \
echo "Customized the sudoers file for passwordless access!" && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "foo user:"; su foo -c 'whoami && id' && \
echo "root user:"; su root -c 'whoami && id'
Что происходит с приведенным выше код:
foo
. foo
добавлен как в группу foo
, так и в группу sudo
. / home / foo
. / bin / bash
. sed
выполняет встроенные обновления файла / etc / sudoers
, чтобы разрешить пользователям foo
и root
беспарольный доступ к группа sudo
. sed
отключает директиву #includedir
, которая позволяет любым файлам в подкаталогах отменять эти встроенные обновления.