Как изменить неверный файл '/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 обратно в предыдущее состояние.

Затем перезагрузите компьютер и все готово.

pkexec visudo

затем верните свои ошибки

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

  1. Перезапустите VirtualBox
  2. Пусть он загружается нормально, пока не спросит ваше имя пользователя и пароль в консоли
  3. Войдите в систему нормально с вашим именем пользователя
  4. Затем, когда вы окажетесь в консоли (при условии, что ваш ящик не загружается в GUI), просто дайте команду su - а затем дайте свой собственный логин пароль.
  5. Это должно теперь закончиться в root@ubuntu-xenial:~# подскажите, если /etc/sudoers не слишком сломан или пуст. Не уверен, что произойдет в этом случае.
  6. Тогда вы можете просто запустить visudo и исправить файл.
  7. затем Ctrl + X и он предложит сохранить измененный буфер. Нажмите Y а также Enter
  8. Перезагрузите коробку, и она должна работать сейчас.

Если ваш /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

А затем просто исправьте синтаксическую ошибку!

  1. Вы можете привязать том /etc к докеру следующим образом:

docker run -it --rm -v /etc:/etc_host ubuntu bash

  1. Вы получили root-доступ. Затем вы можете изменить разрешения на 777:

chmod 777 /etc/sudoers

  1. Отредактируйте, исправьте файл и сохраните его в любом редакторе:

vim /etc/sudoers

  1. Измените разрешения для/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 должны быть решены.

Другие вопросы по тегам