J'ai foiré, sortir en .bashrc

27

J'ai mis "exit" dans mon fichier .bashrc. Je n'ai pas d'accès physique à la machine, donc pour me connecter, j'utilise ssh. Je n'ai pas de privilèges root. Chaque fois que je me connecte au serveur, la connexion se ferme automatiquement.

Jusqu'à présent, j'ai essayé:

  • Écraser .bashrc avec scp et sftp. La connexion se ferme avant que je puisse faire quoi que ce soit.
  • Utilisation de différents programmes GUI pour accéder à ssh (la connexion se ferme)
  • Écraser le fichier avec ftp. (ne peut pas utiliser ftp)
  • Depuis mon ordinateur personnel
    • $ ssh host "bash --noprofile --norc" (la connexion se ferme)
    • $ ssh host "mv .bashrc bashrc_temp" (la connexion se ferme)
    • $ ssh host "rm .bashrc" (même chose)
    • $ ssh host -t (la connexion se ferme)

Puis-je faire quelque chose pour désactiver .bashrc ou peut-être écraser le fichier avant que .bashrc soit fourni?

MISE À JOUR

@ ring0

J'ai essayé votre suggestion, mais pas de chance. Le fichier bashrc s'exécute toujours en premier.

Une autre chose que j'ai essayée était de me connecter avec un autre compte et de modifier sudo le .bashrc, mais je n'ai pas les privilèges sudo sur ce compte.

Je suppose que je vais contacter l'administrateur.

MODIFIER

@shellholic

Je ne peux pas le croire, mais cette approche a fonctionné! Même si "exit" se produit dans les premières lignes (composées uniquement de quelques if si blocs et instructions d' exportation ) dans le fichier .bashrc, j'ai quand même réussi à l'interrompre avec succès en Ctrl-c dans les vingt essais (a pris environ 3 minutes). J'ai supprimé la ligne incriminée dans le .bashrc et tout fonctionne à nouveau.

camel_space
la source
2
darwinawards.com vous devriez avoir (temporairement) un accès en tant qu'utilisateur qui peut remplacer votre fichier .bashrc, ou changer votre shell par défaut pour autre chose. "Demandez à votre administrateur système" comme le dit MS.
2
man 8 sshddit que c'est 9. Runs user's shell or command.la neuvième étape ...: - /
1
scp cessera également de fonctionner car le shell est toujours ouvert et .bashrc est appelé
Aleksandr Levchuk
Pour info, la plupart de ces suggestions ne fonctionnent pas parce que ssh exécute une commande en la passant comme argument au shell de l'utilisateur. Recherchez execve dans session.c. Il n'y a aucun moyen de modifier / ajouter / supprimer les arguments de cette invocation du shell de l'utilisateur.
Mark Wagner

Réponses:

37

vous pouvez essayer d'interrompre (ctrl + C) avant que la partie de sortie de votre ne .bashrcsoit exécutée.

J'ai essayé en ajoutant ce qui suit en haut du bashrc d'un testeur, cela fonctionne, c'est juste une question de timing. Très facile dans mon cas:

sleep 3
echo "Too late... bye"
exit 0
shellholic
la source
8
+1, car c'est probablement la seule solution qui ne nécessite pas l'aide de l'administrateur système. Cependant, beaucoup de chance est nécessaire pour avoir un timing correct (l'hôte ssh -v pourrait aider un peu).
JooMing
En fait, ctrl + C a fonctionné. Même sans dormir. J'ai placé "exit" dans mon bashrc et j'ai pu récupérer avec un ctrl + C rapide après environ 4 essais. Veuillez modifier la réponse pour que je puisse changer le "-1" en "+1".
Aleksandr Levchuk
@Aleksandr Levchuk done
shellholic
4
J'apprécie beaucoup la combinaison d'une faible technologie pathétiquement ridicule et d'une efficacité brutale ici.
unixtippse
1
Je ris comme un fou, cette précipitation quand ça marche enfin. Merci @JooMing, j'ai essayé toutes les méthodes d'ici serverfault.com/questions/94503/… même celle en appuyant sur Ctrl + C, mais cela n'a fonctionné qu'après avoir ajouté l'option -v!
mxmlnkn
12

J'ai également réussi à gâcher mon fichier .bashrc sur un nouveau cluster auquel j'ai eu accès à l'essai. Ne voulant pas ressembler à un noob, la dernière chose que je voulais faire était de demander l'aide des administrateurs, et je n'arrivais pas à faire fonctionner un ^ + C au bon moment.
Ce qui a fonctionné cependant, a été d'envoyer une commande 'rm' comme argument final à ssh. c'est à dire

ssh -tv user@host rm .bashrc

Je n'ai pas pu faire fonctionner une commande 'mv' (essayée avant sans -t), donc je pense que l'option -t doit l'avoir fait, mais vous pouvez tester cela si vous le souhaitez. J'ai maintenant récupéré du fichier .bashrc ~ (créé par vim) tout sauf la ligne douteuse en question et tout va bien dans le monde! = D

Alex Leach
la source
2
ssh -tv user@home mv .bashrc .bashrc-oldtravaillé pour moi
Code Commander
3

Si vous pouvez vous connecter en tant qu'utilisateur différent, essayez ceci:

su user -s /bin/sh

Vous aurez bien sûr besoin de votre mot de passe.

Cakemox
la source
1
vous pouvez essayer un shell différent, pas basé sur sh: kshoucsh
Hubert Kario
3

Si je me souviens de quelques mauvaises expériences que j'ai eues comme ça, les ssh, scp, sftp semblent exécuter les fichiers d'initialisation.

Ma suggestion est d'utiliser un FTP simple, puis de supprimer ou renommer un fichier incorrect sur la ligne de commande FTP après la connexion. Je suppose que votre système vous autorisera à accéder au FTP. Dans un tel cas, assurez-vous de changer votre mot de passe (en toute sécurité) lorsque vous avez terminé la réparation.

mdpc
la source
Filezilla a parfaitement fonctionné pour cela. Il suffit de dérouler le menu "Serveur" et de sélectionner le paramètre "Forcer l'affichage des fichiers cachés".
Danny G
1

De man ssh(pour OpenSSH_5.6p1au moins, je ne sais pas quand il a été ajouté),

~/.ssh/rc
        Commands in this file are executed by ssh when the user logs in, just
        before the user's shell (or command) is started.  See the sshd(8) manual
        page for more information.

.. ce qui signifie que vous pouvez créer ~/.ssh/rccontenant les éléments suivants:

mv ~/.bashrc ~/bak.bashrc

Ensuite, lorsque vous sshentrerez, le bashrc problématique sera déplacé avant le démarrage de votre shell de connexion - vous pouvez alors évidemment réparer le bak.bashrcet le remettre en place

dbr
la source
0

Connectez-vous via SCP ou SFTP et modifiez / renommez / supprimez votre fichier .bashrc de cette façon. Edit - D'oh, je vois que tu as dit que tu avais essayé. Tant pis.

mfinni
la source
0

J'ai eu le même problème et j'ai réussi à le résoudre. J'ai utilisé ssh pour accéder au système et j'ai appuyé et maintenu Ctrl + c dès que je me suis connecté au système. Ensuite, ~ / .bashrc n'a pas été lu et j'ai pu le modifier.

miyashin
la source
1
Copie exacte de la réponse la plus votée ici
pauska
0

J'ai trouvé que ça fonctionnait.

Interrompez le chargeur de démarrage de grub en appuyant sur e ... appuyez à nouveau sur e pour entrer dans les lignes de chargement de grub, appuyez à nouveau sur e pour modifier la ligne du noyau,

aller en fin de ligne;

ajoutez init = / bin / bash à la fin de la ligne,

entrer pour revenir, b pour démarrer,

il ouvrira un shell bash, ouvrira vim /root/.bashrc et modifiera en conséquence. quitter et maintenant vous pourrez vous connecter

Haseeb
la source