Как редактировать .bashrc без входа в систему

17

Возможно, это дублирующий вопрос, но я недостаточно знаком с процессом входа / загрузки CentOS (особенно на ВМ), чтобы знать, что искать.

Я использую CentOS 7 в VirtualBox. Я случайно добавил gnome-terminalв конец моего ~/.bashrcфайла. Поэтому теперь, когда .bashrcя вхожу, появляется окно терминала. Выполняется сеанс терминала , который открывает другое окно и т. Д., И т. Д., И я затоплен множеством gnome-terminalокон терминала.

Я пытаюсь войти в терминальную сессию без входа в систему GUI (поэтому gnome-terminalне удается), но я не могу заставить его загрузиться без GUI. Я пытался использовать ответы на этот вопрос, но безуспешно. Я получаю GUI логин каждый раз: как загрузить CentOS в CLI? , Есть ли другой способ отредактировать конфигурацию grub при загрузке или способ получить доступ к новому экземпляру терминала из входа в GUI, например, Ctrl + Alt + F1 в Ubuntu? (Да, я попробовал. Он либо не работает в CentOS 7, либо не работает в виртуальной машине VirtualBox.) Или есть какой-то другой способ получить терминальную сессию без графического интерфейса, чтобы я мог редактировать свой .bashrcи исправить этот беспорядок?

Майкл Хоффманн
источник
4
Является ли sshdна этой виртуальной машине? Много способов. 1) Запустите как однопользовательский режим (например, введите во время загрузки, выберите ядро, нажмите a, добавьте одиночный , введите ...) 2) если в вашей системе VM запустите sshd, вы можете попробовать скопировать ваши .bashrcизменения и скопировать их обратно ( scp, sftp rsync ...). 3) вы можете войти в систему как другой пользователь и сделать su -... 4) с другой машины (даже виртуальной) вы можете сделать это, ssh user@host mv .bashrc bashrcToModifyзатем войти, изменить ... 0) Прежде чем все CTRL ALT F1работает с ВМ?
Hastur
2
Когда вы говорите «случайно добавленный гном-терминал», как это случилось?
McFedr
@mcfedr Я ждал, когда кто-нибудь спросит XD. Я неправильно понял, для чего .bashrc. Я думал, что он запускался один раз при входе в систему, но он запускается каждый раз, когда запускается любой сеанс оболочки. Я хотел, чтобы окно терминала появлялось при каждом входе в систему, поэтому я и сделал echo 'gnome-terminal' >> ~/.bashrc. Плохая идея. Я предполагаю , что я должен поставить gnome-terminalв /etc/init.dили где - нибудь? Я все еще пытаюсь понять процесс загрузки.
Майкл Хоффманн

Ответы:

13

CtrlAltF1может быть захвачен хостом, или VirtualBox может не передавать его правильно. Пара быстрых тестов говорит мне, что вы можете использовать ключ хоста, определенный в VirtualBox, вместо CtrlAlt(может быть слева Ctrlили слева на Mac). Итак, нажатие F1переключилось на TTY1 в VirtualBox для меня (и аналогично для F7возврата к GUI).

Мур
источник
1
Ага. Это сработало. Ctrl + F2 помог мне. Похоже, что Ctrl + F1 - это сеанс GUI в CentOS, но это тот же принцип. ИМО, это самое простое решение - нет необходимости в дополнительных носителях или редактировании конфигурации загрузки. Я отмечаю это как ответ.
Майкл Хоффманн
2
@MichaelHoffmann: да, это будет эффект от более новой CentOS, чем у меня. Поведение GDM изменилось между 6 и 7, чтобы использовать первый доступный TTY вместо TTY 7.
muru
2
В будущих выпусках ситуация будет меняться: экран входа будет на vconsole 1, и каждый вошедший в систему графический пользователь будет занимать каждый последующий vconsole (когда вы входите в систему, ваш сеанс находится на vconsole 2, если вы переключите пользователя следующим пользователем на vconsole 3 и т. д.).
Майкл Хэмптон
24

Вы можете загрузиться с живого компакт-диска Linux, а затем смонтировать файловую систему CentOS и отредактировать оттуда файл .bashrc.

Чарльз Бердж
источник
2
Самое простое решение. Также работает для неправильной конфигурации, которая препятствует входу в систему или даже полной загрузке (если вы знаете, что не так и как это исправить.)
alexis
Это очень просто, особенно когда пользователю VirtualBox гарантированно присваивается ISO гостевой ОС. Но я боюсь, что должен выбрать ответ Муру, потому что это еще проще. Спасибо за вклад.
Майкл Хоффманн
15

Init / bin / sh из конфигурации grub

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

  1. Перезагрузите свою ВМ
  2. Когда появится меню grub, выберите первую запись и нажмите eдля редактирования. Если он не появляется, перезапустите и удерживайте Shift во время загрузки
  3. Найдите строку, начинающуюся с linux16или linux. Моя выглядит так. Ваш может немного отличаться

    linux16 /vmlinuz-3.10.0-327.18.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernal=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF8
  4. Изменение roк rw( только для чтения флага READWRITE так что вы можете записать изменения) и дополнение init=/bin/shк линии. Это говорит, что Linux запускается /bin/shвместо initзапуска. Пример для моей записи

    linux16 /vmlinuz-3.10.0-327.18.2.el7.x86_64 root=/dev/mapper/centos-root rw crashkernal=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF8 init=/bin/sh
  5. Нажмите Ctrl-X для запуска конфигурации. Это не будет сохранено.

  6. Появится корневая оболочка. Используйте его для редактирования .bashrcи удаления оскорбительной строки.

    Обратите внимание, что вы не должны продолжать использовать ОС в этом состоянии, поскольку оболочка будет работать как PID 1, обычно зарезервированный для initпроцесса. Вы можете продолжить init с помощью, exec /sbin/initно я бы рекомендовал просто перезагрузить

  7. Перезагрузитесь как обычно. Ваши предыдущие изменения будут забыты.

По сути, мы редактируем параметры загрузки, передаваемые Linux из GRUB, которые говорят Linux монтировать корневую файловую систему для чтения-записи и запуска /bin/shдля процесса инициализации.

Это работает для меня, используя Centos 7 и VirtualBox 4.3.12

закон
источник
Хм ... это сработало отлично (и немного тревожно - кто-то может сделать это с моим ноутбуком, чтобы получить корневую оболочку без учетных данных?). Но это вызвало панику ядра, когда я вышел из оболочки, поэтому я не знаю, могу ли я пометить это как ответ ... Можете ли вы объяснить, почему это работает? что делать roи rw? Или еще лучше, есть ли man-страница для linux16? Что я здесь делаю?
Майкл Хоффманн
5
@MichaelHoffmann - это стандартный, хорошо известный способ получения root-прав - вам нужно защитить загрузчик паролем, чтобы заблокировать это. Это вызывает панику ядра, потому что init никогда не должен завершаться, но в противном случае паника безвредна. Вы можете продолжить загрузку exec /sbin/initили как там на самом деле init. roИ rwопции монтирования корневой только для чтения или для чтения и записи. По сути, вы редактируете меню GRUB, чтобы сообщить ему о загрузке Linux с этими параметрами, которые говорят Linux монтировать корневую файловую систему для чтения-записи и запуска sh для init.
Муру
1
@muru Я добавил несколько ваших комментариев в ответ, чтобы прояснить ситуацию.
lex
6

scp отремонтированная копия .bashrcна место

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

user@backup ~ $ scp user@homehost:~/.bashrc busted.bashrc
user@backup ~ $ vim busted.bashrc # fix, fix
user@backup ~ $ scp busted.bashrc user@homehost:~/.bashrc
user@backup ~ $ rm busted.bashrc

Приложение: Как указывает OP ниже, для этого требуется доступ по SSH homehost. Если это не вариант, но вместо него доступен FTP / SFTP, любой метод передачи файлов будет делать то, что вам нужно, то есть просто установить исправленный файл входа в систему.

GWS
источник
1
Это работает, но только если на нем sshdзапущена виртуальная машина (что я не уверен, что CentOS делает по умолчанию), и если сеть настроена правильно с VirtualBox и на хосте, и на виртуальной машине.
Майкл Хоффманн