Как изменить неверный файл '/etc/sudoers'?
Как мне отредактировать неверный файл sudoers? Выдает приведенную ниже ошибку и не позволяет мне снова редактировать, чтобы это исправить.
Вот что происходит:
$ sudo visudo
>>> /etc/sudoers: syntax error near line 28 <<<
sudo: parse error in /etc/sudoers near line 28
sudo: no valid sudoers sources found, quitting
18 ответов
В современной системе Ubuntu (и многих других дистрибутивах GNU/Linux) исправление поврежденного sudoers
Файл на самом деле довольно прост и не требует перезагрузки, использования live CD или физического доступа к машине.
Чтобы сделать это через SSH, войдите в систему и выполните команду pkexec visudo
, Если у вас есть физический доступ к машине, SSH не нужен; просто откройте окно терминала и запустите pkexec
команда.
Предполагая, что вы (или какой-либо другой пользователь) уполномочены запускать программы как root
с PolicyKit, вы можете ввести свой пароль, и тогда он запустится visudo
как root
и вы можете исправить ваши /etc/sudoers
,
Если вам нужно отредактировать один из файлов конфигурации в /etc/sudoers.d
(что необычно в этой ситуации, но возможно), используйте pkexec visudo -f /etc/sudoers.d/filename
,
Если у вас есть связанная ситуация, когда вам нужно выполнить дополнительные команды системного администратора в качестве пользователя root для решения проблемы (также необычно в этом случае, но часто встречается в других), вы можете запустить интерактивную корневую оболочку с pkexec bash
, Вообще говоря, любая неграфическая команда, с которой вы запускаете sudo
можно запустить с pkexec
вместо.
(Если в системе несколько учетных записей пользователей, которым разрешено запускать программы как root
с PolicyKit, затем для любого из этих действий вам будет предложено выбрать, какой из них вы хотите использовать, прежде чем запрашивать ваш пароль.)
Если это не сработает - например, если нет пользователей, авторизованных для запуска программ от имени root с помощью PolicyKit, - загрузитесь с живого компакт-диска Ubuntu (например, с компакт-диска, который вы, вероятно, использовали для установки Ubuntu) и смонтируйте файловую систему для установленная система. Вы можете сделать это, запустив
sudo parted -l
для просмотра ваших разделов - вероятно, есть только один раздел ext4, и это корневая файловая система.Предположим, что корневая файловая система установленной системы Ubuntu находится в /dev/sda1. Тогда вы можете смонтировать его с sudo mount /dev/sda1 /mnt
, Затем вы можете редактировать файл sudoers установленной системы с помощью sudo nano -w /mnt/etc/sudoers
, Или, что еще лучше, вы можете отредактировать его с помощью
sudo visudo -f /mnt/etc/sudoers
(что не позволит вам сохранить файл sudoers с неверным синтаксисом).
Всегда используйте visudo
чтобы редактировать файл sudoers, никогда не редактируйте его самостоятельно. Это не позволит вам сохранить его на диск, если он не проверен.
Введите:
pkexec visudo
Затем измените последнюю строку
#includedir /etc/sudoers
Для того, чтобы:
#includedir /etc/sudoers.d
Это должно решить вашу проблему.
Когда это происходит с системой без графического интерфейса пользователя (возможно, с вашим производственным сервером),
pkexec
сбой с этим сообщением об ошибке:
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
В этой ситуации, используя
pkttyagent
может быть полезным. Если вы хотите удалить поврежденный файл в
sudoers.d
каталог, используйте это:
pkttyagent -p $(echo $$) | pkexec rm /etc/sudoers.d/FILENAME
Если вы хотите восстановить значение по умолчанию
/etc/sudoers
, вы можете использовать эту суть, чтобы скопировать конфигурации по умолчанию, поместив их в место без доступа root (например, ваш
$HOME
). Затем вы можете перезаписать файл sudoers:
pkttyagent -p $(echo $$) | pkexec cp ~/sudoers /etc/sudoers
ПРИМЕЧАНИЕ. Используя этот подход, после выполнения вашей команды, вероятно, ваш доступ к оболочке пропадет. Но я уверен, что потеря одного сеанса оболочки намного лучше, чем потеря вашего сервера! (Согласно справочной странице, это нормальное поведение: когда его службы больше не нужны, процесс может быть остановлен.)
Если у кого-то вроде меня не было установлено pkexec, или не удалось запустить vi, visudo, nano или любой другой редактор для изменения файла sudoers, вы можете быть уверены в этом процессе... Я был сохранен с этим:
- перезагружать
- удерживайте клавишу Shift во время загрузки, чтобы получить опцию для режима восстановления (введите его)
- введите командную строку как root (вторая последняя опция в моем меню grub)
перемонтируйте загрузочное устройство для rw, примените право exec для пользователя и отредактируйте файл
mount -n -o remount,rw / chmod u+x /etc/sudoers nano /etc/sudoers
исправить эту ошибку и быть счастливым:)
Если вы испортили sudoers
файл, вам нужно:
- Перезагрузитесь в режиме восстановления (нажмите escape во время загрузки, выберите режим восстановления на экране grub)
- Выберите опцию "Включить сеть" (если вы этого не сделаете, ваша файловая система будет смонтирована как доступная только для чтения. Кто знал)
- Выберите опцию "Drop to root shell"
- бежать
visudo
, исправь свой файл - Перезагрузка с нормальным вариантом grub
источник: - http://mario.net.au/content/recover-etcsudoers-ubuntu-1204
Для пользователей WSL доступ к плохому
sudoers
гораздо проще:
wsl.exe -u root visudo
Если вы не можете восстановить файл вручную таким образом, вы можете сбросить его до установленной по умолчанию версии (адаптировано из этого ответа ) с помощью:
wsl.exe -u root -e apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" sudo
Важно: Это приведет к сбросу всех файлов конфигурации, связанных с
sudo
, включая другие настройки, сделанные в
/etc/sudoers.d
.
В этом нет ничего плохого #include sudoer.d удаление #include sudoer.d не будет иметь никакого значения.
Но, пожалуйста, убедитесь, что у вас нет синтаксических ошибок. У меня была та же проблема, но я потратил часы на ее устранение и просто понял, что это синтаксические ошибки. Обратитесь к руководству и сделайте их правильными.
Например, скажем, ваше имя пользователя: Долли Я использовал следующее, что неправильно
dolly ALL = (ALL) ALL NO PASSWD: ALL
правильный синтаксис
dolly ALL = (ALL) ALL //give permission to everything, not good
или же
dolly ALL=(ALL) NOPASSWD:/usr/bin/thurderbird //good, give specific permission
надеюсь это поможет
Запустить режим восстановления, затем введите этот
chown -R root:root /etc/sudoers.d chmod u=rwx,g=rx,o=rx /etc/sudoers.d/ chmod u=r,g=r,o= /etc/sudoers.d/*
только группа и пользователь root должны были прочитать privelege
Вы также можете войти как root на tty
консоль с Ctrl+Fn (Fn от 1 до 6) и запустить visudo
,
Вы также можете редактировать загрузочную запись, находясь в grub.
Просто перезагрузите компьютер и подождите, пока не появится grub. Затем нажмите "e" на записи "Ubuntu", чтобы отредактировать ее.
Найдите строку с "linux = " или "kernel = " и просто добавьте "single" в конец этой строки.
Затем нажмите F10, чтобы загрузить эту временно измененную загрузочную запись. Это даст вам оболочку (без графического интерфейса) с правами root, и вы можете редактировать файл sudoers с помощью s.th. как nano /etc/sudoers обратно в предыдущее состояние.
Затем перезагрузите компьютер и все готово.
Добавление этого для новой волны виртуальных машин Linux на основе WSL. Когда я заблокировал себя на своей виртуальной машине WSL2 на базе Debian (Pengwin), в которой не было pkexec и не был установлен пароль root, вот что я обнаружил, решило проблему:
- Откройте Windows Powershell от имени администратора (щелкните правой кнопкой мыши "Запуск от имени администратора").
- Установите пользователя по умолчанию на виртуальной машине как root (потому что он не запрашивает пароль) в соответствии с этой инструкцией:
<distro.exe> config --default-user root
Пример:
ubuntu1804.exe config --default-user root
или
pengwin.exe config --default-user root
- Перезапустите свой дистрибутив.
- Теперь вы должны быть root и можете исправить свою проблему с sudo.
- Повторите процесс, чтобы вернуть пользователя по умолчанию в нормальное состояние.
В Ubuntu 16.04, работающем на VirtualBox (не должно иметь значения), вышеупомянутые методы не работали для меня (недопустимая строка в конце файла). Что работало было:
- Перезапустите VirtualBox
- Пусть он загружается нормально, пока не спросит ваше имя пользователя и пароль в консоли
- Войдите в систему нормально с вашим именем пользователя
- Затем, когда вы окажетесь в консоли (при условии, что ваш ящик не загружается в GUI), просто дайте команду
su -
а затем дайте свой собственный логин пароль. - Это должно теперь закончиться в
root@ubuntu-xenial:~#
подскажите, если/etc/sudoers
не слишком сломан или пуст. Не уверен, что произойдет в этом случае. - Тогда вы можете просто запустить
visudo
и исправить файл. - затем
Ctrl + X
и он предложит сохранить измененный буфер. НажмитеY
а такжеEnter
- Перезагрузите коробку, и она должна работать сейчас.
Если ваш /etc/sudoers
пусто или отсутствует что-то, и вы можете отредактировать это, тогда вот мое содержимое:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
Существует более простое решение. Без перезагрузки, режима восстановления или pkgexec
(pkgexec
не работал и понятия не имею, почему или как я должен это использовать), просто сделайте:
su root # switch to root user, without using sudo (which is broken at this point)
your_favorite_editor /etc/sudoers # e.g. nano
А затем просто исправьте синтаксическую ошибку!
- Вы можете привязать том /etc к докеру следующим образом:
docker run -it --rm -v /etc:/etc_host ubuntu bash
- Вы получили root-доступ. Затем вы можете изменить разрешения на 777:
chmod 777 /etc/sudoers
- Отредактируйте, исправьте файл и сохраните его в любом редакторе:
vim /etc/sudoers
- Измените разрешения для
/etc/sudoers
по умолчанию 440:
chmod 440 /etc/sudoers
Вот и все.
Хорошая практика: окно резервного копирования и запуск sudo su
там. На другом termianl запустите visudo или sudo vim /etc/sudoers. Если что-то пойдет не так, вернитесь к первому терминалу и исправьте файл. Вы можете спросить, почему бы просто не запустить sudo su
до visudo
в одном терминале? Это также работает, но риск того, что вы закроете терминал до того, как вы его узнаете, выше.
Если у вас есть доступ для перезагрузки сервера, вы можете перезагрузить его и поймать его в командной строке grub для Ubuntu. Нажмите «e», чтобы отредактировать конфигурацию загрузки grub.
Найдите строку, которая начинается с linux и имеет отступ, затем перейдите к концу этой строки и добавьте пробел, а затем
init=/bin/bash
. Затем нажмите F10, чтобы загрузить сервер. В командной строке root введите
mount -o remount,rw /
и нажмите ввод.
Теперь у вас есть доступ как root для изменения /etc/sudoers или /etc/sudoers.d/filename.
После того, как вы закончите изменять файлы по мере необходимости, введите
reboot -f
и сервер перезагрузится как обычно, и ваши проблемы с sudo должны быть решены.