Як редагувати .bashrc без входу


17

Це, мабуть, повторне запитання, але я недостатньо знайомий з процесом входу / завантаження CentOS (особливо в VM), щоб знати, що шукати.

Я запускаю 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 VM.) Або є інший спосіб, як я можу отримати термінальний сеанс без GUI, щоб я міг редагувати свою .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працює з VM?
Гастур

2
Коли ви кажете "випадково доданий gnome-термінал", як це сталося?
mcfedr

@mcfedr Я чекав, коли хтось запитає XD. Я неправильно зрозумів, для чого .bashrc. Я думав, що він був запущений один раз під час входу, але він запускається кожного разу, коли починається будь-який сеанс оболонки. Я хотів, щоб термінальне вікно з’являлося кожного разу, коли я входив, так і робив echo 'gnome-terminal' >> ~/.bashrc. Погана ідея. Я припускаю , що я повинен поставити gnome-terminalв /etc/init.dабо де - небудь? Я все ще намагаюся зрозуміти процес завантаження.
Майкл Гофман

Відповіді:


13

CtrlAltF1може бути захоплено хостом, або VirtualBox може не передати його правильно. Кілька швидких тестів підказують мені, що ви можете використовувати ключ хоста, визначений у VirtualBox, а CtrlAltне лівий Ctrlабо лівий на Macs. Отже, натискання F1переключилося на TTY1 у VirtualBox для мене (і аналогічно для F7повернення до GUI).


1
Так. Це спрацювало. Ctrl + F2 зробив для мене трюк. Схоже, Ctrl + F1 - це сеанс GUI у CentOS, але це той самий принцип. IMO - це найпростіше рішення - немає необхідності в додаткових носіях або редагуванні конфігурації завантаження. Я відзначаю це як відповідь.
Майкл Гофман

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. Перезавантажте свій VM
  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для процесу init

Це працює для мене за допомогою Centos 7 та VirtualBox 4.3.12


Гм ... це прекрасно працювало (і трохи тривожно - чи може хтось зробити це на моєму ноутбуці, щоб дістатися до кореневої оболонки без повноважень?). Але це викликало паніку ядра, коли я вийшов з оболонки, тому я не знаю, чи можу я позначити це як відповідь ... Чи можете ви пояснити, чому це працює? що робити roі rw? Або ще краще, чи є сторінка для linux16? Що я тут роблю?
Майкл Гофман

5
@MichaelHoffmann - це стандартний, добре відомий спосіб отримати корінь - вам потрібно захистити завантажувач паролем, щоб заблокувати це. Це викликає паніку в ядрі, оскільки init ніколи не повинен виходити, але паніка не є нешкідливою в іншому випадку. Ви можете продовжувати завантажуватись до того exec /sbin/initчи іншого фактичного init. Параметри roі rwпараметри монтують корінь лише для читання або читання-запису. Ви по суті редагуєте меню GRUB, щоб вказати йому на завантаження Linux за допомогою цих параметрів, які дозволяють Linux монтувати кореневу файлову систему для читання-запису та запускаючи sh for init.
муру

1
@muru Я додав кілька ваших коментарів у відповідь, щоб допомогти зрозуміти речі.
lex

6

скапуйте відремонтовану копію .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

Додаток: Як вказує ОП нижче, для цього потрібен доступ до SSH homehost. Якщо це не варіант, але натомість доступний FTP / SFTP, будь-який метод передачі файлів зробить все, що вам потрібно, а це просто встановити виправлений файл входу.


1
Це працює, але лише в тому випадку, якщо VM sshdпрацює на ньому (що я не впевнений, що CentOS робить за замовчуванням) і якщо мережа налаштована правильно з VirtualBox і в хості, і в VM.
Майкл Гофман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.