Я сломал свой файл sudoers на сильно загруженном сервере с синтаксической ошибкой. К сожалению, я потерял пароль root. Сервер критичен, и я бы хотел избежать перезагрузки. Итак, без sudo, без рута, без перезагрузки, без kdesudo или gksu. Сервер - это виртуальная машина, работающая на kvm.
Как бы вы это исправить?
Это не общее решение, но я публикую его как источник вдохновения для людей, находящихся в такой же ситуации.
У меня не было доступа к упомянутым решениям, но мне очень повезло, что у меня был доступ к задаче cron, которая выполнялась как root
. Я использовал эту задачу cron для запуска другого скрипта, который исправил /etc/sudoers
и с этого момента я буду использовать только visudo
.
Так что, если вы находитесь в такой ситуации, задачи cron могут быть вам полезны. Нет простоев / перезапуска сервера и нет риска испортить данные dd
.
Просто непроверенная идея:
В хост-системе у вас есть доступ к образу гостевого раздела, верно? Вы не можете легко смонтировать этот образ, поскольку он используется. Но вам не нужно монтировать раздел для редактирования одного файла.
Найдите сектор файла sudoers в разделе - либо используйте текстовый поиск по некоторой фразе, которая, как вы знаете, существует в вашем файле sudoers и не часто появляется в других файлах, например # This file MUST be edited with the 'visudo' command as root.
Возможно, вы можете использовать для этого какой-нибудь шестнадцатеричный редактор графического интерфейса, в качестве альтернативы я считаю, что grep также может справиться с этой задачей.
Или, может быть, вы можете обнаружить сектор, в котором находится файл sudoers, из гостевой ОС ...
Используйте шестнадцатеричный редактор для редактирования файла прямо на диске или используйте dd
- скопировать сектор в текстовый файл, отредактировать и скопировать обратно в исходный сектор.
Трудности: 1. возможно, файл кешируется внутри гостевой ОС, возможно, вы найдете способ очистить кеши. 2. С помощью текстового поиска вы можете найти несколько файлов, похожих на ваши sudoers, например, удаленные версии, либо вы узнаете, какой из них право один или исправить все.
Я испытал подобное sudoers проблема на моем устройстве Synology NAS.
Мое решение заключалось в том, чтобы поместить следующую команду в «Планировщик заданий»
chmod 0755 /etc/sudoers
Который я настроил на запуск как корень.
Хотя моя проблема была связана с разрешениями, я уверен, что правильно настроенная серия перенаправлений вывода в командной строке очистит файл и заменит содержимое базовой оболочкой, которая вернет вас к работе.
Что-то вроде:
echo "Defaults syslog=authpriv" > /etc/sudoers
echo "%administrators ALL=(ALL) ALL" >> /etc/sudoers
echo "Cmnd_Alias SHELL = /bin/ash, /bin/sh, /bin/bash" >> /etc/sudoers
echo "Cmnd_Alias SU = /usr/bin/su" >> /etc/sudoers
echo "%wheel ALL=(ALL) NOPASSWD: ALL, !SHELL, !SU" >> /etc/sudoers
Найдите дату последнего обновления, а затем найдите корневой эксплойт с этой даты.
Загрузите свой компьютер из живого дистрибутива, например Ubuntu; смонтировать раздел, содержащий корневой каталог. Предположим, что это раздел / dev / sda2, вы можете смонтировать его с помощью
sudo mount /dev/sda2 /mnt
Теперь вы выполняете chroot для каталога / mnt,
sudo chroot /mnt
Теперь вы получили root-права на своем жестком диске. Вы можете изменить пароли root и пользователей с помощью:
passwd
passwd username
Теперь, когда вы сбросили пароли, исправить файл sudoers очень просто:
pkexec visudo
Он запросит ваш пароль. Строго говоря, для этого требуется авторизация с помощью PolicyKit. Вы можете найти дополнительную информацию Вот. В целом это проще, чем вы думаете.
К счастью, наш сервер является виртуальным, и я могу получить доступ к хост-системе. Я исправил проблему, отредактировав необработанные данные на диске. Вы также можете попробовать этот способ, но будьте очень осторожны. Метод опасен. Вы можете повредить другие файлы, раздел или даже весь жесткий диск. Так что делайте это на свой страх и риск и убедитесь, что у вас есть последние резервные копии.
sync
на гостя.Попробуйте прочитать испорченный текст с помощью dd
и убедитесь, что числа верны. skip = position / ibs.
sudo dd if = / dev / vg0 / vm-100-disk-1 count = 1 bs = 10 ibs = 10 skip = 1104162476
Чтобы исправить ошибку, перезапишите поврежденный текст. В моем случае я просто заменил первый символ на '#', чтобы закомментировать сломанные вещи. Использование / obs / seek параметров, установленных для / ibs / skip с одинаковыми номерами. Будьте осторожны с символами новой строки и eof.
echo "#ncludedir" | sudo dd of = / dev / vg0 / vm-100-disk-1 count = 1 bs = 10 obs = 10 seek = 1104162476
Вы можете прочитать еще раз с помощью dd и проверить, сделали ли вы то, что вам нужно.
Вернитесь к терминалу виртуальной машины и попробуйте использовать sudo сейчас. Возможно, вам нужно как-то очистить кеш чтения диска. Удачи на этом этапе! :)