Supposons donc que quelqu'un tape dans leur quelque chose .bashrc
qui 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 .bashrc
puisque 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_profile
comprend .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
[ -z "$PS1" ] && return
au 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.Réponses:
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.
la source
ssh -t username@hostname /bin/sh
travaille pour moi.la source
.cshrc
/.tcshrc
même pour les shells non interactifs.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.
la source
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.
la source
Vous devez a) démarrer bash sans
source
utiliser ni~/.bashrc
ou~/.bash_profile
et b) puisqu’un tel shell ne serait pas un shell de connexion complet / n’avoir aucun tty attaché, forcer ssh à attacher un tty :la source
ls
de vous convaincre que vous y êtes :). Notez aussi que cela utilisera undumb
terme, donc pour moi, nano ne fonctionne pasVous n'avez pas de chance.
Toutes les commandes ssh exécutent votre shell de connexion.
ssh $COMMAND
s'exécute$SHELL -c $COMMAND
,scp
s'exécute$SHELL -c /path/to/sftp-server
,ssh
tout simplement exécute votre shell.la source
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@host
exécutera .bash_profilessh user@host /bin/bash
exécutera .bashrc, mais pense que ce n'est pas interactif (pas d'invite).ssh -t user@host /bin/bash
exé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@host
est 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.
la source
/bin/sh
fait arriver à exécuter d' abord, il serait aider, car Bash ne charge~/.bashrc
lorsqu'il est invoqué commesh
. Cette réponse est un sur-ensemble de votre autre réponse. Veuillez donc supprimer l’autre.Quelque chose comme:
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.
la source
essayer
^ C il y a contrôle-v puis c
la source
la source
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
exit
est tôt dans le .bashrc.Vous pouvez mettre un ctrl-C dès que possible en le dirigeant directement sur ssh:
Notez que
^C
c'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
-tt
obligeant 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.la source
Vous pouvez essayer d'écraser le
.bash_profile
avec un fichier vide en utilisant lascp
commande. De ce que j'ai googlé, scp utilise un identifiant non interactif qui ne lit pas.bash_profile
.la source
Vous pouvez également simplement supprimer le fichier bashrc:
la source
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:
la source
S'il vous plaît ne pas couper et exécuter, modifier
user
ethost
, puis éditerletmein
et enregistrer en tant que.bashrc
la source
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:
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.
la source
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!
la source
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_DIR
mail et vous envoyer le résultat?la source