Восстановление после установки оболочки root на плохой файл


23

Допустим, я пошел и сделал глупую вещь, такую ​​как использование chsh, чтобы изменить оболочку пользователя root на неверный путь к файлу. Последующие входы в систему с учетной записью root будут внезапно завершены с ошибкой, с указанием / bin / что-либо еще не найдено, и вы вернетесь к экрану входа. За исключением режима восстановления или вставки LiveCD для редактирования / etc / passwd, каковы мои варианты возврата моей системы? Давайте также предположим (для удовольствия?), Что в колесе нет других пользователей. Мысли?


Это гипотетическая ситуация, которую вы предлагаете?
— Крис Даун

Я действительно сделал именно это на (относительно новой) установке FreeBSD. С тех пор он был переустановлен, поэтому я полагаю, что теперь он несколько гипотетичен, но мне любопытно, каким был бы лучший путь к восстановлению, если бы у меня действительно была полная система.
— Ноффл

Был там, сделал это, получил футболку. Но в результате на каждой машине, которую я администрирую, я на всякий случай сохраняю резервную корневую учетную запись.
— Марк Д

Ответы:


30

При загрузке добавьте init=/bin/bash(или путь к любой другой функциональной оболочке) к своим параметрам загрузки - вы попадете прямо в однопользовательскую оболочку. Возможно, вам придется сделать это mount -o remount,rw /перед изменением /etc/passwdзаписи в этой среде. После этого просто перезагрузите или сделайте exec /sbin/init 3. Только не печатайте exitи не нажимайте Ctrl + D, так как это приведет к панике ядра *.

В некоторых системах, загружаемых в двухэтапном режиме (с образом initrd), может потребоваться еще один вариант этого метода. Если вы заметили, что параметры загрузки содержат init=и, что наиболее важно, real_init=то место для размещения /bin/bashдолжно быть последним параметром (т.е. real_init=/bin/bash).

* Это потому, что в этой среде оболочка рассматривается ядром как программа init - единственный процесс, который знает ядро ​​- она ​​представляет работающую систему под глазом ядра. Внезапное завершение этого процесса без указания ядра на выключение системы должно привести к панике ядра. (Не паникуете ли вы, если вдруг все вокруг станет черным и тихим?)


Nice для exec, но я предполагаю , что это лучше не портить слишком много с заранее точки монтирования.
— Стефан Гименес

2
@ Stéph Это нужно сделать, если ваше ядро ​​не монтирует root для чтения и записи. В противном случае вы не сможете изменить какие-либо файлы (в том числе /etc/passwd).
— rozcietrzewiacz

Хорошая мысль! Мне удалось войти в однопользовательский режим, но меня не поразило, что мне пришлось перемонтировать / как чтение / запись для изменения / etc / passwd. Благодарность!
— Ноффл

@roz Конечно, я пытался сказать, что позабочусь о том, чтобы размонтировать все остальное, возможно, было смонтировано (кроме /) перед выполнением init.
— Стефан Гименес

@ Stéph Не должно быть проблем с креплениями. Обратите внимание, что /bin/bashвыполняется точно в точке, а затем /sbin/initбудет выполняться при нормальной загрузке. Таким образом, в это время система не может предпринять никаких действий.
— rozcietrzewiacz

10

Вы можете использовать suи указать оболочку для выполнения (я не уверен, что если вы пытаетесь наказать, что это невозможно, если вы заметили, что других пользователей нет wheel):

su -c /bin/bash

В противном случае вы можете сделать нечто подобное, если ваш демон ssh разрешает вход в систему с правами root:

ssh root@localhost /bin/bash

Вы также можете установить оболочку как ваш init в вашем загрузчике, например, init=/bin/kshили аналогичном.


1
Хорошие идеи. =) Как вы и подозревали, другие пользователи не могут использовать 'su'. У sshd также отключен root-логин.
— Ноффл

6

Если ваш загрузчик настроен так, чтобы разрешить оперативное редактирование параметров ядра, решение состоит в том, чтобы перезагрузить компьютер и использовать оболочку в качестве процесса инициализации, например init=/bin/bash. Затем смонтируйте все, что нужно, вручную, и отредактируйте /etc/passwd. syncи загрузитесь снова со своим обычным init.


Ничего себе, я только что заметил, что вы отправили тот же ответ в ту же минуту, что и я :-)
— rozcietrzewiacz

6

Если суть вашего вопроса заключается в том, что вы заблокировали все способы стать пользователем root, то по определению вы не можете стать пользователем root.

Обычно в системе Unix разрешено три способа получения прав root:

  • Войдите в систему как пользователь root, введя rootприглашение для входа в систему и введя пароль root. Это запускает оболочку root.
  • Войдите в систему как обычный пользователь, затем войдите в систему как root, запустив suи введя пароль root. В некоторых системах это требует нахождения в определенной группе (часто называемой wheel); в других системах любой, кто знает пароль root, может стать пользователем root. Системы, использующие PAM для аутентификации, используют pam_wheelдля управления группой колес, если они есть. Если вы укажете команду с помощью su -c, она будет выполнена через оболочку root.
  • Войдите в систему как обычный пользователь, затем войдите в систему как root, запустив sudoи введя свой собственный пароль. Учетная запись пользователя должна быть наделена полномочиями sudo администратором. Если не ограничено в sudoersфайле, вы можете запустить любую команду, независимо от оболочки root.

Традиционным способом защиты от недоступности оболочки root является определение другой учетной записи с UID 0 и другой оболочки ( toorэто традиционное имя). Например, если оболочка root представляет собой динамически связанный исполняемый файл (хорошая идея для экономии памяти) и обновление библиотеки происходит неправильно, оболочка root может оказаться непригодной для использования. У альтернативной учетной записи root будет статически связанный исполняемый файл, возможно, со встроенными общими утилитами, такими как BusyBox .


5

Приведенные выше ответы великолепны, и я узнал, прочитав их Если вы не помните подробности этих подходов и не возражаете против перезагрузки, вы всегда можете загрузить свою систему, используя дистрибутив live CD, смонтировать раздел /, а затем отредактировать / etc / passwd и перезагрузиться. Не так элегантно, как приведенные выше решения, но легче запомнить.


Вы должны указать на риски, связанные с ручным редактированием /etc/passwdфайла. Помимо этого, хороший момент - я просто хотел добавить то же предложение в мой ответ.
— rozcietrzewiacz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.