Как изменить неверный файл '/ etc / sudoers'?


238

Как мне отредактировать неверный файл 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

2
большой вопрос, учитывая, что эта страница создает эту ошибку help.ubuntu.com/community/RootSudoTimeout

Ответы:


361

В современной системе 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 с неверным синтаксисом).


7
pkexec / usr / sbin / visudo работал над Debian 7
marinara

10
СВЯТАЯ КОРОВА! Большое спасибо! Спас мой бекон. Добавлен файл в соответствии с предложением в каталог etc / sudoers.d /, ИСПОЛЬЗУЮЩИЙ РЕГУЛЯРНЫЙ ТЕКСТОВЫЙ РЕДАКТОР (DON-T__D-O__T-HAT !!!). Утрачены все возможности делать повышенные привилегии, ВКЛЮЧАЯ, редактировать оскорбительный файл. Это помогло отредактировать файл. Как ни странно, мне сначала нужно было отредактировать / etc / sudoers, затем он нашел ошибки в другом файле и открыл их для меня. ДАЖЕ ВЕРОЯТНОСТЬ, директива в файле / etc / sudoers 'inlcudedir /etc/sudoers.d' была закомментирована, и она все еще включает ее.
Деннис

4
@Dennis Несколько запутанно, #includeдирективы в sudoersфайлах обрабатываются специально; в этом случае ведущий #не вызывает интерпретацию остальной части строки как комментария. Как man sudoersговорится: «Знак фунта ('#') используется для обозначения комментария (если только он не является частью директивы #include или если ..." См. Также visudo: #includedir sudoers.d (заархивировано из lzone.de/). блог ).
Элия ​​Каган

5
Мой пользователь sudoer, но я получил эту ошибку: Ошибка выполнения команды от имени другого пользователя: не авторизован
SuB

2
В Ubuntu 16.04 pkexec visudoзапрашивает пароль, который не принимает правильный пароль. Выдает ошибку «СБОЙ АУТЕНТИФИКАЦИИ».
Юха Унтинен

54

Всегда используйте visudoдля редактирования файла sudoers, никогда не редактируйте его самостоятельно. Это не позволит вам сохранить его на диск, если он не проверен.


17
задним числом 20/20
code_monk

4
Это не предотвратит катастрофу. Достаточно легко обоснованно отрицать себя.
Джошуа

Может ли visudo использоваться скриптами? Если так, то как?
Лукас

У меня не установлено visudo. Итак, я сделал pkexec vim. Затем он показывает список пользователей и запрашивает пароль. Когда я предоставляю пароль, он выдает ошибку «Ошибка выполнения команды от имени другого пользователя: не авторизован». Пожалуйста, помогите
Shyamkkhadka

24

Печатать:

pkexec visudo

Затем измените последнюю строку

#includedir /etc/sudoers

Для того, чтобы:

#includedir /etc/sudoers.d

Это должно решить вашу проблему.


2
Я заметил, что удаление ведущей #строки #includedirвызывает синтаксические ошибки, #это часть директивы, по крайней мере, в Ubuntu 12.10.
SAFX

1
Это только избавило меня от головной боли.
Addo Solutions

1
У меня не установлено visudo. Итак, я сделал pkexec vim. Затем он показывает список пользователей и запрашивает пароль. Когда я предоставляю пароль, он выдает ошибку «Ошибка выполнения команды от имени другого пользователя: не авторизован». Пожалуйста, помогите
Shyamkkhadka

11

если у кого-то вроде меня не было установлено pkexec , или не удалось запустить vi, visudo, nano или любой другой редактор для изменения файла sudoers, вы можете быть уверены в этом процессе ... Я был сохранен с этим:

  • перезагрузка
  • удерживайте клавишу Shift во время загрузки, чтобы получить опцию для режима восстановления (введите его)
  • введите командную строку как root (вторая последняя опция в моем меню grub)
  • перемонтируйте загрузочное устройство для rw, примените право exec для пользователя и отредактируйте файл

    mount -n -o remount,rw /
    chmod u+x /etc/sudoers
    nano /etc/sudoers
    

исправить эту ошибку и быть счастливым :)


Хотя решение pkexec, предложенное @ eliah-kagan, кажется более простым, оно более универсально. На моей машине оказалось, что pkexec не установлен, и, конечно, я не смог его установить, потому что sudo apt-get install pkexec почему-то не работал.
Running.t

Также в рамках этого подхода я бы использовал visudoвместо этого nano /etc/sudoers.
pa4080

7

Если вы испортили свой sudoersфайл, вам необходимо:

  • Перезагрузитесь в режиме восстановления (нажмите escape во время загрузки, выберите режим восстановления на экране grub)
  • Выберите опцию «Включить сеть» (если вы этого не сделаете, ваша файловая система будет смонтирована как доступная только для чтения. Кто знал)
  • Выберите опцию «Drop to root shell»
  • запустить visudo, исправить свой файл
  • Перезагрузка с нормальным вариантом grub

источник: - http://mario.net.au/content/recover-etcsudoers-ubuntu-1204


Привет, это удаляет iptables, файлы существующей системы?
Шямкхадка

6

В этом нет ничего плохого #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

надеюсь это поможет


Лучше, чем убедиться, что у вас нет синтаксических ошибок, - всегда использовать visudoпри редактировании этих файлов, что гарантирует, что у вас не будет синтаксических ошибок, прежде чем он изменит файл. visudoне только для редактирования /etc/sudoers- он также будет создавать и редактировать файлы в /etc/sudoers.d. Он также будет работать с любым текстовым редактором, который вы хотите. Смотрите man-страницу для деталей.
Элия ​​Каган

Что касается предоставления конкретного разрешения, обратите внимание, что это полезно только для очень простых команд / приложений, потому что любое достаточно сложное приложение (в том числе thunderbird, которое никогда не должно запускаться как root) эффективно предоставит пользователю полный доступ к системе при запуске от имени root. Даже, казалось бы, простая функциональность открывает двери для полного корневого доступа. Например, пользователь, который может запустить программу, которая может сохранить файл в произвольном месте в качестве пользователя root, может получить полный root-доступ (он может установить свой собственный root /etc/sudoersили, если ограничения синтаксиса препятствуют этому, он может установить свой собственный /etc/crontab).
Элия ​​Каган

3

запустить режим восстановления, затем введите этот

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


3

Вы также можете войти в систему как root на ttyконсоли с Ctrl+ Fn( Fnот 1 до 6) и запустить visudo.


2

Вы также можете редактировать загрузочную запись, находясь в grub.

Просто перезагрузите компьютер и подождите, пока не появится grub. Затем нажмите «e» на записи «Ubuntu», чтобы отредактировать ее.

Найдите строку с «linux =» или «kernel =» и просто добавьте «single» в конец этой строки.

Затем нажмите F10, чтобы загрузить эту временно измененную загрузочную запись. Это даст вам оболочку (без графического интерфейса) с правами root, и вы можете редактировать файл sudoers с помощью s.th. как nano / etc / sudoers обратно в предыдущее состояние.

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


2
pkexec visudo

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


1
не нужно использовать pkexec
Braiam

@Braiam visudoдолжен быть запущен от имени пользователя root. Если sudoне работает, pkexecиногда работает. Это покрыто моим предыдущим ответом ... но это правильный ответ, visudoсам по себе (когда он не запускается от имени root) не сработает, и в правильных кратких ответах могут быть полезны значения, даже если их рекомендации значительно совпадают с другими ответами. Конечно, если один переходит в режим восстановления, это корневая оболочка , а затем ни sudoни visudoнеобходимо для команды типа pkexec. Может быть, это то, что вы имеете в виду ...
Элия ​​Каган

0

В 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

Ваш шаг 4 не имеет смысла, он работает только тогда, когда ваш пароль root совпадает с вашим обычным пользователем.
Альфред

Что очень распространено в локальной виртуальной машине.
Юха Унтинен

0

Хорошая практика: резервное окно терминала и запуск sudo suтам. На другом termianl запустите visudo или sudo vim / etc / sudoers. Если что-то пойдет не так, вернитесь к первому терминалу и исправьте файл. Вы можете спросить, почему бы просто не запустить sudo suраньше visudoв одном терминале? Это также работает, но риск того, что вы закроете терминал, прежде чем вы это узнаете, выше.


-1

Существует более простое решение. Без перезагрузки, режима восстановления или 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

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


Что с понижением? Сработало идеально для меня.
rien333
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.