Comment modifier .bashrc sans vous connecter

17

Il s'agit probablement d'une question en double, mais je ne connais pas suffisamment le processus de connexion / démarrage de CentOS (en particulier sur une machine virtuelle) pour savoir quoi rechercher.

J'utilise CentOS 7 dans VirtualBox. J'ai accidentellement ajouté gnome-terminalà la fin de mon ~/.bashrcdossier. Alors maintenant, une fenêtre de terminal apparaît lorsque je me connecte. Cette session de terminal s'exécute .bashrc, ce qui ouvre une autre fenêtre, etc., etc., et je suis inondé d'une tonne de gnome-terminalfenêtres de terminal.

J'essaie de me connecter à une session de terminal sans la connexion GUI ( gnome-terminaléchoue donc ), mais je ne peux pas le faire démarrer sans l'interface graphique. J'ai essayé d'utiliser les réponses à cette question, sans succès. J'obtiens une connexion GUI à chaque fois: Comment démarrer CentOS en CLI? . Existe-t-il un autre moyen de modifier la configuration de grub au démarrage, ou un moyen d'accéder à une nouvelle instance de terminal à partir de la connexion GUI, comme Ctrl + Alt + F1 dans Ubuntu? (Oui, je l'ai essayé. Cela ne fonctionne pas dans CentOS 7, ou il ne fonctionne pas dans une machine virtuelle VirtualBox.) Ou existe-t-il un autre moyen d'obtenir une session de terminal sans interface graphique, donc je peux modifier mon .bashrcet réparer ce gâchis?

Michael Hoffmann
la source
4
Est sshdsur cette machine virtuelle? Plusieurs façons. 1) Commencez en mode utilisateur unique (par exemple, entrez au démarrage, sélectionnez le noyau, appuyez sur a, ajoutez un seul , entrez ...) 2) si dans votre système VM exécutez sshd, vous pouvez essayer de copier votre .bashrcmodification et de la recopier ( scp, sftp rsync ...). 3) vous pouvez vous connecter en tant qu'autre utilisateur et faire su -... 4) à partir d'une autre machine (même virtuelle) vous pouvez ssh user@host mv .bashrc bashrcToModifyalors vous connecter, modifier ... 0) Avant tout, ça CTRL ALT F1marche depuis la VM?
Hastur
2
Lorsque vous dites "gnome-terminal accidentellement ajouté", comment est-ce arrivé?
mcfedr
@mcfedr J'attendais que quelqu'un demande à XD. J'ai mal compris à quoi ça .bashrcservait. Je pensais qu'il était exécuté une fois lors de la connexion, mais il est exécuté à chaque démarrage d'une session shell. Je voulais qu'une fenêtre de terminal apparaisse à chaque fois que je me connectais, alors je l'ai fait echo 'gnome-terminal' >> ~/.bashrc. Mauvaise idée. Je suppose que je devrais mettre gnome-terminaldans /etc/init.dou quelque part? J'essaie toujours de comprendre le processus de démarrage.
Michael Hoffmann

Réponses:

13

CtrlAltF1peut être capturé par l'hôte, ou VirtualBox peut ne pas le transmettre correctement. Quelques tests rapides me disent que vous pouvez utiliser la clé Host définie dans VirtualBox au lieu de CtrlAlt(pourrait être la gauche Ctrlou la gauche sur Mac). Donc, appuyer sur est F1passé à TTY1 dans VirtualBox pour moi (et de même pour F7revenir à l'interface graphique).

muru
la source
1
Ouaip. Ça a marché. Ctrl + F2 a fait l'affaire pour moi. Il semble que Ctrl + F1 soit la session GUI dans CentOS, mais c'est le même principe. IMO c'est la solution la plus simple - pas besoin de média supplémentaire ou de modification de la configuration de démarrage. Je marque cela comme la réponse.
Michael Hoffmann
2
@MichaelHoffmann oui, ce serait un effet d'un CentOS plus récent que moi. Le comportement GDM a changé entre 6 et 7 pour utiliser le premier TTY disponible au lieu de TTY 7.
muru
2
Cela change encore dans les versions futures: l'écran de connexion sera sur vconsole 1, et chaque utilisateur graphique connecté occupera chaque vconsole suivante (lorsque vous vous connectez, votre session est sur vconsole 2, si vous changez d'utilisateur, le prochain utilisateur sera sur vconsole 3, etc.).
Michael Hampton
24

Vous pouvez démarrer avec un CD Linux en direct, puis monter le système de fichiers CentOS et éditer le fichier .bashrc à partir de là.

Charles Burge
la source
2
Solution la plus simple. Fonctionne également pour les erreurs de configuration qui empêchent la connexion ou même le démarrage complet (tant que vous savez ce qui ne va pas et comment l'inverser.)
alexis
Ceci est extrêmement simple, en particulier lorsqu'un utilisateur VirtualBox est à peu près garanti d'avoir une image ISO du système d'exploitation invité. Mais je crains de devoir sélectionner la réponse de muru car c'est encore plus simple. Merci pour votre contribution.
Michael Hoffmann
15

Init / bin / sh à partir de la configuration grub

Vous pouvez modifier votre configuration grub pour charger un shell racine au lieu d'aller à l'interface graphique.

  1. Redémarrez votre VM
  2. Lorsque le menu grub apparaît, sélectionnez la première entrée et appuyez sur epour modifier. S'il n'apparaît pas, redémarrez et maintenez Shift pendant le démarrage
  3. Trouvez la ligne commençant par linux16ou linux. Le mien ressemble à ça. Le vôtre peut différer légèrement

    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. Remplacez le ropar rw( indicateur en lecture seule par readwrite pour pouvoir écrire les modifications) et ajoutez-le init=/bin/shà la ligne. Cela indique à Linux de s'exécuter /bin/shau lieu du initdémarrage. Exemple pour mon entrée

    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. Appuyez sur Ctrl-X pour exécuter la configuration. Il ne sera pas enregistré.

  6. Un shell racine apparaîtra. Utilisez-le pour modifier votre .bashrcet supprimer la ligne incriminée.

    Notez que vous ne devez pas continuer à utiliser le système d'exploitation dans cet état car le shell s'exécutera en tant que PID 1, normalement réservé au initprocessus. Vous pouvez continuer manuellement l'initialisation avec exec /sbin/initmais je recommanderais simplement de redémarrer

  7. Redémarrez normalement. Vos modifications précédentes seront oubliées.

Nous modifions essentiellement les options de démarrage passées à Linux à partir de GRUB, qui indiquent à Linux de monter le système de fichiers racine en lecture-écriture et de démarrer /bin/shle processus d'initialisation

Cela fonctionne pour moi en utilisant Centos 7 et VirtualBox 4.3.12

lex
la source
Hm ... cela fonctionnait parfaitement (et un peu dérangeant - quelqu'un pourrait-il faire cela à mon ordinateur portable pour accéder à un shell racine sans informations d'identification?). Mais cela a provoqué une panique du noyau lorsque j'ai quitté le shell, donc je ne sais pas si je peux marquer cela comme la réponse ... Pouvez-vous expliquer pourquoi cela fonctionne? qu'est-ce que roet rw? Ou mieux encore, existe-t-il une page de manuel pour linux16? Qu'est ce que je fais ici?
Michael Hoffmann
5
@MichaelHoffmann c'est un moyen standard et bien connu de se rooter - vous devez protéger par mot de passe le chargeur de démarrage pour bloquer cela. Cela provoque une panique du noyau car init n'est jamais censé sortir, mais la panique est inoffensive sinon. Vous pouvez continuer le démarrage par exec /sbin/initou quel que soit le réel init. Les options roet rwmontent root en lecture seule ou en lecture-écriture. Vous modifiez essentiellement le menu GRUB pour lui dire de démarrer Linux avec ces options, qui indiquent à Linux de monter le système de fichiers racine en lecture-écriture et de démarrer sh pour init.
muru
1
@muru J'ai ajouté quelques-uns de vos commentaires dans la réponse pour clarifier les choses.
lex
6

scp une copie réparée de .bashrcen place

Si vous avez une autre machine pour travailler, récupérez une copie du fichier cassé et corrigez le problème, puis remettez-le d'où il vient. Cela évite de se connecter et d'appeler l'une des commandes de connexion.

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

Addendum: Comme OP le souligne ci-dessous, cela nécessite un accès SSH à homehost. Si ce n'est pas une option mais que FTP / SFTP est disponible à la place, toute méthode de transfert de fichiers fera ce dont vous avez besoin, qui consiste simplement à installer le fichier de connexion corrigé.

gws
la source
1
Cela fonctionne, mais uniquement si la machine virtuelle est en sshdcours d'exécution (ce que je ne suis pas sûr que CentOS fait par défaut), et si le réseau est correctement configuré avec VirtualBox et dans l'hôte et dans la machine virtuelle.
Michael Hoffmann