Connectez-vous sans exécuter bash_profile ou bashrc

75

Supposons donc que quelqu'un tape dans leur quelque chose .bashrcqui l'empêche de se connecter via ssh(c.-à-d. Que le login SSH se ferme à cause de l'erreur dans le fichier). Existe-t-il un moyen permettant à cette personne de se connecter sans l'exécuter (ou .bashrcpuisque l'un exécute l'autre), ou sinon de supprimer / renommer / invalider le fichier?

Supposons que vous n’ayez pas d’accès physique à la machine et que c’est le seul compte d’utilisateur disposant de la capacité de ssh.

Pour référence: .bash_profilecomprend .bashrc:

[[ -f ~/.bashrc ]] && . ~/.bashrc

Edit: Choses que j'ai essayées:

ssh user@host "rm ~/.bashrc"

scp nothing user@host:/RAID/home/tom/.bashrc

ssh user@host  "/bin/bash --norc"

Tous donnent l'erreur:

/RAID/home/tom/.bashrc: line 16: /usr/local/bin/file: No such file or directory
/RAID/home/tom/.bashrc: line 16: exec: /usr/local/bin/file: cannot execute: No such file or directory
Tom Ritter
la source
4
Votre commande scp ne fonctionnera pas car scp lira également .bashrc lors de la connexion. Pour éviter le problème À l'avenir, vous pouvez ajouter quelque chose comme [ -z "$PS1" ] && returnau début de ./bashrc. De cette façon, scp cessera d’analyser .bashrc après la première ligne et vous pourrez l’écraser en cas d’urgence.
dalloliogm

Réponses:

24

Je pense que vos seules options sont:

  • SSH en tant qu'un autre utilisateur et su sur votre compte;

  • utilisez quelque chose comme ftp ou smbclient, si les services pertinents sont activés sur l'hôte;

  • trouvez une vulnérabilité ouverte dans un service réseau ouvert et exploitez-la :).

  • demandez à un administrateur de résoudre le problème.

alsacs
la source
4
"Supposons que vous n’ayez pas d’accès physique à la machine, et que c’est le seul compte utilisateur ayant la capacité de ssh."
Dennis Williamson
Je vais dans cette voie. Je posterai la solution après l'avoir trouvée. Heureusement, j'ai quelques voies d'attaque.
Tom Ritter
1
utilisé Filezilla à SFTP sur mon serveur et il m'a corrigé. Merci beaucoup, tu m'as sauvé. J'ai eu une condition "sortie 1" dans mon .bash_profile par accident et il m'a arrosé.
djangofan
118

ssh -t username@hostname /bin/sh travaille pour moi.

utilisateur60069
la source
Cela fonctionne bien - simple et fournit un shell que vous pouvez utiliser pour résoudre le problème.
MT.
1
Essayer de faire cela avec l'application Secure Shell dans Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ) mais ne peut pas comprendre comment / où placer les arguments de ligne de commande. Des conseils?
Benj
2
Cela ne fonctionne pas pour moi (bien que cela devrait se faire selon la page de manuel). L'hôte local exécute Ubuntu 14.04.1 et Ubuntu 12.04.5 sur l'hôte distant. Je ne peux pas rsync car mon shell de connexion est tcsh et sur l'hôte distant, il affiche des ordures (tcsh: aucun fichier ou répertoire de ce type tcsh: essayant de démarrer à partir de "/ u / levy" - le répertoire est monté sur NSF). J'ai pensé résoudre le problème en contournant le shell de connexion, mais cela ne fonctionne pas.
Silvio Levy
2
Si votre shell par défaut est csh / tcsh, il recherchera toujours votre .cshrc/ .tcshrcmême pour les shells non interactifs.
Brian Vandenberg
Je suis assis ici en train de rire de ma propre stupidité d’être arrivé à ce point. Votre solution a très bien fonctionné. Merci beaucoup d'avoir aidé ce bricoleur à faire le travail
ijustlovemath le
36

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é sur 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
11
J'étais sceptique, mais ça marche vraiment ...
rmobis,
C'est du génie!
user1747134
Travaille réellement ... merci! Les autres méthodes n'ont jamais fonctionné pour moi.
Zzzach ...
sur mac avec seulement un .bash_profile, cela a fonctionné pour moi :)
AnneTheAgile
OMG, je pensais avoir cherché sur Internet, puis j'ai décidé d'essayer cela, et c'est le seul moyen qui fonctionne pour moi! Merci!
Jiahao Cai
21

J'ai utilisé un CVE publié pour exécuter une commande en tant que root via une interface Web dans un logiciel de surveillance du réseau que j'avais installé. rm /RAID/home/tom/.bashrc

Ensuite, je pourrais me connecter et svn annuler les modifications apportées.

Tom Ritter
la source
11
C'est à la fois génial et failriffic.
MikeyB
1
@ TomRitter: Veuillez fournir cette référence.
user2284570
1
C'était dans une ancienne version de cactus, donc à moins que vous n'utilisiez un logiciel vieux de 8 ans, je ne pense pas que cela vous aidera. Et si vous utilisez un logiciel de 8 ans, je ne peux pas vous aider. ;)
Tom Ritter
15

Vous devez a) démarrer bash sans sourceutiliser ni ~/.bashrcou ~/.bash_profileet b) puisqu’un tel shell ne serait pas un shell de connexion complet / n’avoir aucun tty attaché, forcer ssh à attacher un tty :

ssh -t user@host bash --norc --noprofile
Christian Krause
la source
3
Cela fonctionne, mais notez que vous n'aurez pas l'invite habituelle, mais un écran vide. essayez lsde vous convaincre que vous y êtes :). Notez aussi que cela utilisera un dumbterme, donc pour moi, nano ne fonctionne pas
Ciprian Tomoiagă
7

Vous n'avez pas de chance.

Toutes les commandes ssh exécutent votre shell de connexion. ssh $COMMANDs'exécute $SHELL -c $COMMAND, scps'exécute $SHELL -c /path/to/sftp-server, sshtout simplement exécute votre shell.

Tobu
la source
3
Ceci est également vrai pour sftp - même les sous-systèmes SSH sont apparemment exécutés à partir d'un shell.
Lxgr
D'après mon expérience, vous avez raison, même si la page de manuel de ssh indique "Si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un shell de connexion". Pourtant, l’affiche a pu résoudre le problème en utilisant la réponse la mieux notée (ssh hostname / bin / sh). Ce qui donne?
Silvio Levy
@ Silvio, la réponse de OP est qu'il a utilisé un exploit qui n'est pas lié à SSH.
Tobu
Droite. Quelqu'un a signalé le succès de la réponse la mieux notée et j'ai rapidement supposé qu'il s'agissait du PO. J'aurais aimé que cela fonctionne. J'ai une situation similaire, bien que ce soit simplement agaçant et non invalidant. (Voir mon commentaire sous la réponse la mieux notée ci-dessus.)
Silvio Levy Le
6

Aucune des réponses ci-dessus ne peut contourner le shell de connexion de ssh. Vous pouvez passer une ligne de commande complète et il exécute le shell distant pour traiter la commande et définir l'environnement de travail de la commande. C'est à ça que servent les shells et c'est la manière Unix. Vous auriez toutes sortes de problèmes de compatibilité si vous essayiez d'exécuter quelque chose sans shell. De même, essayer un contrôle-C devrait faire la même chose que d'appeler exit, qui est le comportement que vous essayez d'éviter. Si bash continue, c'est un bug. Pourquoi les gens n'arrêtent pas de dire que la page de manuel dit quelque chose de différent, il est nécessaire de la citer car elle ne dit rien de la sorte dans ma page de manuel.

De plus, sur la plupart des systèmes Linux, spécifier / bin / sh ne fait rien car il ne s'agit que d'un lien symbolique vers bash!

Tu veux tester? Ajoutez les instructions "echo" .bashrc et .profile et voyez lesquelles sont exécutées. J'ai fait. Voici les résultats.

ssh user@hostexécutera .bash_profile ssh user@host /bin/bashexécutera .bashrc, mais pense que ce n'est pas interactif (pas d'invite). ssh -t user@host /bin/bashexécute .bashrc deux fois ... une fois lors de la connexion, une fois pour la commande transmise, donc spécifier TOUT shell exécutera toujours le premier. ssh -T user@hostest identique à ne pas spécifier -T ou -t du tout.

Maintenant, si vous remarquez, mon système n'exécute pas les deux fichiers, mais l'un ou l'autre. Mais l'affiche d'origine comporte une ligne dans .bash_profile qui exécute .bashrc. Par conséquent, .bashrc sera toujours exécuté quoi qu'il arrive. Je n'aurais pas dû mettre cette ligne là! Si cette ligne n'existait pas, vous n'auriez pas eu de problème.

Vous devrez trouver un autre moyen ou trouver un administrateur. C'est à cela que servent les administrateurs.

Evan Langlois
la source
Quelques bons points pas exécutable passé comme une commande peut aider, comme vous expliquer, mais sur un point un peu discutable: si a /bin/sh fait arriver à exécuter d' abord, il serait aider, car Bash ne charge ~/.bashrclorsqu'il est invoqué comme sh. Cette réponse est un sur-ensemble de votre autre réponse. Veuillez donc supprimer l’autre.
Mklement
3

Quelque chose comme:

ssh host "/bin/bash --norc"

ce qui semble fonctionner, mais notez que PS1 n'est pas défini, vous saisissez donc des commandes sans invite.

Cela a l'avantage d'être non destructif.

Dennis Williamson
la source
1
Cela ne fonctionne pas, il a d'abord essayé de se connecter avec succès, mais ne peut pas se connecter et ne peut donc pas exécuter bash --norc
Tom Ritter
2

essayer

echo ^C | ssh <hostname> ' rm .bashrc'

^ C il y a contrôle-v puis c

utilisateur161180
la source
1
C'est ctrl-v et ctrl-c sur mon système. Merci quand même! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
Wytten
la source
Cela a fonctionné pour moi dans un environnement très restreint où rien ne fonctionnerait. Je devais spécifier le chemin complet vers .bashrc.
Zbeekman
1

Le mashing ctrl-C fonctionne tant que vous pouvez obtenir un ctrl-C avant que le fichier .bashrc ne se ferme. Malheureusement, cela peut être difficile à faire s’il exitest tôt dans le .bashrc.

Vous pouvez mettre un ctrl-C dès que possible en le dirigeant directement sur ssh:

{ echo ^C; cat /dev/tty; } | ssh -tt user@host

Notez que ^Cc'est tapé comme ctrl-V suivi de ctrl-C.

Cela dirige un seul ctrl-C suivi d'une entrée du terminal de contrôle, tout en -ttobligeant un psuedo-terminal à être alloué. Cela dit, vous obtenez un shell (quelque peu malformé) sur la machine distante tout en contournant autant que possible le fichier .bashrc.

Chris
la source
0

Vous pouvez essayer d'écraser le .bash_profileavec un fichier vide en utilisant la scpcommande. De ce que j'ai googlé, scp utilise un identifiant non interactif qui ne lit pas .bash_profile.

Laurent Etiemble
la source
À moins que je ne me souvienne (de façon hypothétique) de la mauvaise structure de répertoire, et que cela ne me donne pas d'erreur à ce sujet, cela ne fonctionne pas - scp exécute également le (s) fichier (s).
Tom Ritter
1
Ce que les gens ne réalisent pas, c'est que scp n'a rien de spécial; c'est juste une autre commande exécutée sur ssh - ce qui signifie à peu près tout ce qui se passe pour une session ssh interactive avec scp, également.
larsks
que dire de sftp, autant que je sache, c’est un sous-système ssh.
Allo
0

Vous pouvez également simplement supprimer le fichier bashrc:

ssh <hostname> rm ~/.bashrc
sybreon
la source
Le problème est dans le fichier .bash_profile, pas dans le bashrc.
Laurent Etiemble
1
Cela ne fonctionne pas - il essaie d'abord de créer un shell et échoue.
Tom Ritter
0

Si votre système est configuré normalement, .bash_profile ne sera pas exécuté pour un shell non interactif (tel que l'exécution d'une commande).

Puisque vous déclarez que le problème se trouve dans le fichier .bash_profile, essayez de le déplacer:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"
Lockie
la source
Je ne pensais pas que la façon dont les fichiers étaient liés importait - .bash_profile inclut .bashrc = (j'ai ajouté plus d'informations.
Tom Ritter
1
Mais ce que suggère Lockie - ce qui est confirmé par la page de manuel bash - est qu'un shell non interactif ne fonctionnera pas .bashrc ou .bash_profile. Cependant, même lorsque vous passez des commandes sur la ligne de commande ssh (comme dans cet exemple), bash est toujours démarré en tant que shell "interactif", ce qui signifie qu'il lira votre fichier .bashrc. Donc, une bonne idée, mais malheureusement, ssh ne coopérera pas.
larsks
0

UH = 'utilisateur @ hôte'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

S'il vous plaît ne pas couper et exécuter, modifier useret host, puis éditer letmeinet enregistrer en tant que.bashrc

SpiesInOrbit
la source
0

Félicitations à user60069, cela a fonctionné pour moi, mais j’utilise le fichier de démarrage spécifique au shell, .bashrc; la connexion avec / bin / sh a donc fonctionné pour moi.

Cependant, si vous êtes dans une situation "pas de chance", je vous propose cette solution, basée sur les solutions de user60069 et de Dennis W:

ssh -t you@host  /bin/bash --noprofile  --norc

Dennis W a proposé l'option --norc, ce qui, dit-on, ne fonctionnait pas pour eux.

Exécutez "man bash" ou "man (votre shell)" pour les options permettant de désactiver les fichiers de démarrage. Il vous suffit d’utiliser un shell abominable le temps qu’il faut pour résoudre le problème.

Jim
la source
0

Une autre façon de se connecter au serveur est sans profil, veuillez trouver la commande ci-dessous
ssh -t user@host bash --noprofile

Pour AWS utilisant un fichier pem et aucun autre utilisateur
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

J'espère que cela t'aides!

Krutarth Shah
la source
-1

Parmi les suggestions et les réponses données ci-dessus, je dirais que ce ne sont pas les fichiers .bashrc ou .bash_profile. De plus, ssh manpage indique que si vous spécifiez une commande à exécuter, vos fichiers de profil ne seront pas lus.

Je suggérerais d'essayer d'exécuter un shell de connexion différent (ksh? Csh? Sh?) À partir du chemin absolu; Veillez également à ce que le problème soit totalement différent (quota? autorisation d'exécution et de lecture sur votre répertoire personnel?), une approche latérale serait préférable. Pouvez-vous demander à un autre utilisateur de faire un ls -la $YOUR_HOME_DIRmail et vous envoyer le résultat?

lorenzog
la source