Jak edytować plik .bashrc bez logowania

17

To prawdopodobnie duplikat pytania, ale nie znam wystarczająco procesu logowania / rozruchu CentOS (szczególnie na maszynie wirtualnej), aby wiedzieć, czego szukać.

Korzystam z CentOS 7 w VirtualBox. Przypadkowo dołączyłem gnome-terminaldo końca mojego ~/.bashrcpliku. Więc teraz pojawia się okno terminala, gdy się loguję. Sesja terminala jest wykonywana .bashrc, co otwiera kolejne okno itp. Itd. I jestem zalany mnóstwem gnome-terminalokien terminala.

Próbuję zalogować się do sesji terminala bez logowania GUI (więc gnome-terminalkończy się niepowodzeniem), ale nie mogę go uruchomić bez GUI. Próbowałem użyć odpowiedzi na to pytanie, ale bez powodzenia. Za każdym razem otrzymuję login GUI: Jak uruchomić CentOS w CLI? . Czy istnieje inny sposób edycji konfiguracji grub podczas rozruchu lub sposób uzyskania dostępu do nowej instancji terminala z poziomu logowania GUI, np. Ctrl + Alt + F1 w Ubuntu? (Tak, próbowałem. To albo nie działa w CentOS 7, albo nie działa w VirtualBox VM.) Lub jest inny sposób na uzyskanie sesji terminalu bez GUI, więc mogę edytować .bashrci naprawić ten bałagan?

Michael Hoffmann
źródło
4
Czy sshddziała na tej maszynie wirtualnej? Wiele sposobów. 1) Uruchom jako tryb pojedynczego użytkownika (np. Wejdź w czasie rozruchu, wybierz jądro, naciśnij a, dołącz pojedynczy , wprowadź ...) 2) jeśli w systemie VM uruchomisz sshd, możesz spróbować skopiować .bashrcmodyfikację i skopiować ją ponownie ( scp, sftp rsync ...). 3) możesz zalogować się jako inny użytkownik i zrobić su -... 4) z innej maszyny (nawet wirtualnej) możesz ssh user@host mv .bashrc bashrcToModifywtedy zalogować, zmodyfikować ... 0) Przed wszystkim CTRL ALT F1działa z maszyny wirtualnej?
Hastur
2
Kiedy mówisz „przypadkowo dołączony terminal gnome”, jak to się stało?
mcfedr
@mcfedr Czekałem, aż ktoś zapyta XD. Źle zrozumiałem, po co .bashrc. Myślałem, że był uruchamiany raz podczas logowania, ale jest uruchamiany przy każdym uruchomieniu sesji powłoki. Chciałem, aby okno terminalu wyświetlało się przy każdym logowaniu, więc zrobiłem to echo 'gnome-terminal' >> ~/.bashrc. Kiepski pomysł. Chyba powinienem umieścić gnome-terminalw /etc/init.dlub gdzieś? Nadal próbuję zrozumieć proces uruchamiania.
Michael Hoffmann

Odpowiedzi:

13

CtrlAltF1może zostać przechwycony przez hosta lub VirtualBox może nie przekazać go poprawnie. Kilka szybkich testów mówi mi, że możesz użyć klucza Host zdefiniowanego w VirtualBox zamiast CtrlAlt(może to być lewy Ctrllub lewy komputer Mac). Tak więc naciśnięcie F1przełącza na TTY1 w VirtualBox dla mnie (i podobnie dla F7powrotu do GUI).

muru
źródło
1
Tak. To się udało. Ctrl + F2 załatwiło sprawę. Wygląda na to, że Ctrl + F1 to sesja GUI w CentOS, ale to ta sama zasada. IMO to najprostsze rozwiązanie - nie ma potrzeby instalowania dodatkowego nośnika ani edytowania konfiguracji rozruchu. Zaznaczam to jako odpowiedź.
Michael Hoffmann
2
@MichaelHoffmann tak, byłby to efekt nowszego CentOS niż ja. GDM zachowanie zmieniło się między 6 a 7 do korzystania z pierwszego dostępnego TTY zamiast TTY 7.
Muru
2
Zmienia się dalej w przyszłych wydaniach: ekran logowania będzie na konsoli vconsole 1, a każdy zalogowany użytkownik graficzny zajmie każdą kolejną vconsole (po zalogowaniu sesja jest na konsoli vconsole 2, jeśli użytkownik przełączy się, następny użytkownik będzie na konsoli vconsole 3 itp.).
Michael Hampton
24

Możesz uruchomić system z dysku CD z systemem Linux na żywo, a następnie zamontować system plików CentOS i stamtąd edytować plik .bashrc.

Charles Burge
źródło
2
Najprostsze rozwiązanie. Działa również w przypadku nieprawidłowych konfiguracji, które uniemożliwiają zalogowanie się, a nawet całkowite uruchomienie (o ile wiesz, co jest nie tak i jak je odwrócić).
Alexis
Jest to niezwykle proste, szczególnie tam, gdzie użytkownik VirtualBox ma gwarancję posiadania ISO systemu operacyjnego gościa. Ale obawiam się, że muszę wybrać odpowiedź Muru, ponieważ jest to jeszcze prostsze. Dziękuję za wkład.
Michael Hoffmann
15

Init / bin / sh z konfiguracji grub

Możesz edytować swoją konfigurację grub, aby załadować powłokę root zamiast przejść do GUI.

  1. Uruchom ponownie maszynę wirtualną
  2. Kiedy pojawi się menu grub, wybierz pierwszy wpis i naciśnij, eaby edytować. Jeśli się nie pojawi, uruchom ponownie i przytrzymaj klawisz Shift podczas rozruchu
  3. Znajdź linię zaczynającą się od linux16lub linux. Mój wygląda tak. Twoje mogą się nieznacznie różnić

    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. Zmień na ( flaga tylkoro do odczytu na zapis, aby móc zapisywać zmiany) i dołącz do linii. To mówi Linuksowi, aby działał zamiast przy starcie. Przykład mojego wpisurwinit=/bin/sh/bin/shinit

    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. Naciśnij Ctrl-X, aby uruchomić konfigurację. To nie zostanie zapisane.

  6. Pojawi się powłoka root. Użyj go, aby edytować swoją .bashrclinię i usunąć ją.

    Pamiętaj, że nie powinieneś nadal używać systemu operacyjnego w tym stanie, ponieważ powłoka będzie działała jako PID 1, zwykle zarezerwowana dla initprocesu. Możesz ręcznie kontynuować init za pomocą, exec /sbin/initale zalecam tylko ponowne uruchomienie

  7. Uruchom ponownie jak zwykle. Twoje poprzednie zmiany zostaną zapomniane.

Zasadniczo edytujemy opcje rozruchu przekazane do systemu Linux z GRUB, które mówią Linuksowi, aby zamontował główny system plików do odczytu i zapisu i rozpoczął /bin/shproces inicjowania

Działa to dla mnie przy użyciu Centos 7 i VirtualBox 4.3.12

leksykon
źródło
Hm ... działało idealnie (i trochę niepokojąco - czy ktoś mógłby to zrobić na moim laptopie, aby dostać się do powłoki roota bez poświadczeń?). Spowodowało to jednak panikę jądra, gdy opuściłem powłokę, więc nie wiem, czy mogę to zaznaczyć jako odpowiedź ... Czy możesz wyjaśnić, dlaczego to działa? co robić roi co rw? A może jeszcze lepiej, czy jest strona podręcznika dla systemu Linux? Co ja tutaj robię?
Michael Hoffmann
5
@MichaelHoffmann to standardowy, dobrze znany sposób na rootowanie - musisz zabezpieczyć bootloaderem hasłem, aby to zablokować. Powoduje panikę jądra, ponieważ init nigdy nie powinien wyjść, ale inaczej panika jest nieszkodliwa. Możesz kontynuować uruchamianie przez exec /sbin/initcokolwiek init. roI rwopcje montowania korzeń tylko do odczytu lub odczytu. Zasadniczo edytujesz menu GRUB, aby kazało mu uruchomić Linuksa za pomocą tych opcji, które nakazują Linuksowi zamontować główny system plików do odczytu i zapisu i uruchomić sh dla init.
muru
1
@muru Dodałem kilka twoich komentarzy do odpowiedzi, aby wyjaśnić sprawę.
Lex
6

scp naprawioną kopię .bashrcw miejscu

Jeśli masz inną maszynę do pracy, weź kopię uszkodzonego pliku i napraw problem, a następnie umieść go z powrotem tam, skąd pochodzi. Pozwala to uniknąć logowania i wywoływania jakichkolwiek poleceń logowania.

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

Dodatek: Jak wskazuje OP poniżej, wymaga to dostępu do SSH homehost. Jeśli nie jest to opcja, ale zamiast tego dostępny jest FTP / SFTP, każda metoda przesyłania plików zrobi to, czego potrzebujesz, to po prostu zainstalować poprawiony plik logowania.

gws
źródło
1
Działa to, ale tylko wtedy, gdy sshdna nim działa maszyna wirtualna (czego nie jestem pewien, że CentOS domyślnie ma) i jeśli sieć jest poprawnie skonfigurowana z VirtualBox oraz na hoście i na maszynie wirtualnej.
Michael Hoffmann