Melden Sie sich an, ohne bash_profile oder bashrc auszuführen

75

Nehmen wir also an, man hat etwas in ihre eingegeben .bashrc, das ihn (oder sie) daran hindert, sich über ssheinzuloggen (dh der SSH-Login wird aufgrund des Fehlers in der Datei beendet). Gibt es eine Möglichkeit, sich anzumelden, ohne es auszuführen (oder .bashrcda das eine das andere ausführt ) oder die Datei auf andere Weise zu löschen / umzubenennen / ungültig zu machen?

Angenommen, Sie haben keinen physischen Zugriff auf den Computer und dies ist das einzige Benutzerkonto, das ssh-fähig ist.

Als Referenz: .bash_profilebeinhaltet .bashrc:

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

Bearbeiten: Dinge, die ich versucht habe:

ssh user@host "rm ~/.bashrc"

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

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

Alle geben den Fehler:

/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
quelle
4
Ihr scp-Befehl funktioniert nicht, da scp beim Verbindungsaufbau auch .bashrc liest. So vermeiden Sie das Problem In Zukunft können Sie möglicherweise etwas wie [ -z "$PS1" ] && returnam Anfang von ./bashrc hinzufügen. Auf diese Weise stoppt scp das Parsen von .bashrc nach der ersten Zeile und Sie können es im Notfall überschreiben.
Dalloliogm

Antworten:

24

Ich denke, Ihre einzigen Möglichkeiten sind:

  • ssh in als ein anderer Benutzer und su zu Ihrem Konto;

  • Verwenden Sie etwas wie ftp oder smbclient, wenn die entsprechenden Dienste auf dem Host aktiviert sind.

  • finde eine offene Schwachstelle in einem offenen Netzwerkdienst und nutze sie aus :).

  • Bitten Sie einen Administrator, das Problem zu beheben.

larsks
quelle
4
"Angenommen, Sie haben keinen physischen Zugriff auf den Computer, und dies ist das einzige Benutzerkonto, das ssh-fähig ist."
Dennis Williamson
Ich gehe diesen Weg. Ich werde die Lösung veröffentlichen, nachdem ich sie gefunden habe. Zum Glück habe ich ein paar Angriffsmöglichkeiten.
Tom Ritter
1
Ich habe Filezilla verwendet, um SFTP in meinen Server einzuspielen und es hat mich repariert. Vielen Dank, du hast mich gerettet. Ich hatte versehentlich einen "exit 1" -Zustand in meinem .bash_profil und es hat mich abgespritzt.
Djangofan
117

ssh -t username@hostname /bin/sh funktioniert bei mir.

user60069
quelle
Dies funktioniert problemlos und bietet eine Shell, mit der Sie das Problem beheben können.
MT.
1
Versuchen Sie dies mit der Secure Shell-App in Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ), aber Sie können nicht herausfinden, wie / wo die Befehlszeilenargumente platziert werden sollen. Irgendwelche Tipps?
Benj
2
Dies funktioniert bei mir nicht (obwohl es laut Manpage sein sollte). Der lokale Host führt Ubuntu 14.04.1 und Ubuntu 12.04.5 auf dem Remote-Host aus. Ich kann rsync nicht ausführen, weil meine Login - Shell tcsh ist und auf dem Remote - Host Müll ausgegeben wird Verzeichnis ist NSF gemountet). Ich dachte, ich würde das Problem lösen, indem ich die Login-Shell umgehe, aber das funktioniert nicht.
Silvio Levy
2
Wenn Ihre Standard - Shell csh ist / tcsh es wird immer Ihre Quelle .cshrc/ .tcshrcauch für nicht-interaktive Shell.
Brian Vandenberg
Ich sitze hier und lache über meine eigene Dummheit, bis zu diesem Punkt gekommen zu sein. Ihre Lösung hat hervorragend funktioniert. Vielen Dank, dass Sie diesem
Bastler
36

Ich hatte das gleiche Problem und konnte es irgendwie lösen. Ich habe ssh verwendet, um auf das System zuzugreifen, und habe Strg + C gedrückt und gehalten, sobald ich mich beim System angemeldet habe. Dann wurde ~ / .bashrc nicht gelesen, und ich konnte es ändern.

Miyashin
quelle
11
Ich war skeptisch, aber das funktioniert tatsächlich ...
rmobis
Das ist Genie!
user1747134
Funktioniert eigentlich ... danke! Die anderen Methoden haben bei mir nie funktioniert.
Zzzach ...
Auf einem Mac mit nur einem .bash_profile funktionierte dies für mich :)
AnneTheAgile
OMG, ich dachte, ich hätte das ganze Internet durchsucht, dann habe ich mich entschlossen, dies zu versuchen, und dies ist der einzige Weg, der für mich funktioniert! Vielen Dank!
Jiahao Cai
21

Ich habe einen veröffentlichten CVE verwendet, um einen Befehl als Root über eine Webschnittstelle in einer von mir installierten Netzwerküberwachungssoftware auszuführen. rm /RAID/home/tom/.bashrc

Dann konnte ich mich einloggen und die vorgenommenen Änderungen durch svn rückgängig machen.

Tom Ritter
quelle
11
Das ist gleichzeitig fantastisch und ausfallsicher.
MikeyB
1
@TomRitter: Bitte geben Sie diese Referenz an.
user2284570
1
Es war eine Oooold-Version von Cacti, also glaube ich nicht, dass es Ihnen helfen wird, wenn Sie keine 8-jährige Software verwenden. Und wenn Sie eine 8 Jahre alte Software verwenden, kann ich Ihnen nicht helfen. ;)
Tom Ritter
15

Sie müssen a) die Bash starten, ohne sourceentweder ~/.bashrcoder zu wählen, ~/.bash_profileund b) da eine solche Shell keine vollständige Anmeldeshell wäre / kein tty angehängt ist, zwingen Sie ssh , ein tty anzuhängen :

ssh -t user@host bash --norc --noprofile
Christian Krause
quelle
3
Dies funktioniert, aber beachten Sie, dass Sie nicht die übliche Eingabeaufforderung erhalten, sondern nur einen leeren Bildschirm. versuche lsdich selbst davon zu überzeugen, dass du dabei bist :). Beachten Sie auch, dass hier ein dumbBegriff verwendet wird, sodass Nano für mich nicht funktioniert
Ciprian Tomoiagă
7

Du hast kein Glück mehr.

Alle ssh-Befehle führen Ihre Login-Shell aus. ssh $COMMANDläuft $SHELL -c $COMMAND, läuft , scpläuft $SHELL -c /path/to/sftp-servereinfach sshnur deine Shell.

Tobu
quelle
3
Dies gilt auch für sftp - sogar SSH-Subsysteme werden anscheinend aus einer Shell heraus ausgeführt.
lxgr
Nach meiner Erfahrung sind Sie richtig, obwohl auf der SSH-Manpage steht: "Wenn ein Befehl angegeben ist, wird er auf dem Remote-Host anstelle einer Login-Shell ausgeführt." Das Poster konnte das Problem jedoch mit der bestbewerteten Antwort (ssh hostname / bin / sh) lösen. Was gibt?
Silvio Levy
@ Silvio, OPs Antwort ist, dass er einen Exploit verwendet hat, der nicht mit SSH zusammenhängt.
Tobu
Richtig. Jemand meldete Erfolg mit der bestbewerteten Antwort, und ich ging hastig davon aus, dass es sich um das OP handelte. Ich wünschte, es hätte funktioniert - ich habe eine ähnliche Situation, obwohl es nur ärgerlich ist, nicht lähmend. (Siehe meinen Kommentar unter der am höchsten bewerteten Antwort oben.)
Silvio Levy
6

Keine der obigen Antworten kann die Login-Shell von ssh umgehen. Sie können eine vollständige Befehlszeile übergeben und daher die Remote-Shell ausführen, um den Befehl zu verarbeiten und die Arbeitsumgebung für den Befehl festzulegen. Das ist, was Shells sind und es ist der Unix-Weg. Sie hätten alle möglichen Kompatibilitätsprobleme, wenn Sie versuchen würden, etwas ohne Shell auszuführen. Ebenso sollte der Versuch, ein Steuerelement-C auszuführen, dasselbe tun wie der Aufruf von exit, was das Verhalten ist, das Sie vermeiden möchten. Wenn bash fortfährt, ist es ein Fehler. Warum die Leute immer wieder sagen, dass auf der Manpage etwas anderes steht, um es zu zitieren, weil auf meiner Manpage nichts dergleichen steht.

Außerdem hat die Angabe von / bin / sh auf den meisten Linux-Systemen NICHTS zu bedeuten, da dies nur ein Symlink zu bash ist!

Willst du testen? Fügen Sie "echo" -Anweisungen zu ".bashrc" und ".profile" hinzu und sehen Sie, welche ausgeführt werden. Ich tat. Hier sind die Ergebnisse.

ssh user@hostwird ausgeführt .bash_profile ssh user@host /bin/bashwird ausgeführt .bashrc, aber es denkt, es ist nicht interaktiv (keine Eingabeaufforderung). ssh -t user@host /bin/bashführt .bashrc zweimal aus ... einmal bei der Anmeldung, einmal für den übergebenen Befehl. Wenn Sie also eine beliebige Shell angeben, wird immer die erste ausgeführt. ssh -T user@hostEntspricht der Angabe von -T oder -t überhaupt nicht.

Wenn Sie jetzt bemerken, werden auf MEINEM System nicht beide Dateien ausgeführt, sondern nur die eine oder die andere. Das ursprüngliche Poster enthält jedoch eine Zeile in .bash_profile, in der .bashrc ausgeführt wird, sodass .bashrc immer ausgeführt wird, egal was passiert. Hätte diese Zeile nicht dort setzen sollen! Wenn diese Linie nicht existiert hätte, hättest du kein Problem gehabt.

Sie müssen einen anderen Weg finden oder einen Administrator finden. Dafür sind Admins da.

Evan Langlois
quelle
Einige gute Punkte; Wie Sie erläutern, kann keine als Befehl übergebene ausführbare Datei helfen, aber in gewisser Hinsicht: Wenn /bin/sh sie zuerst ausgeführt werden müsste , würde dies helfen, da Bash nicht geladen wird, ~/.bashrcwenn sie als aufgerufen wird sh. Diese Antwort ist eine Obermenge Ihrer anderen Antwort. Löschen Sie daher die andere Antwort.
Mklement
3

So etwas wie:

ssh host "/bin/bash --norc"

Das scheint zu funktionieren, aber beachten Sie, dass PS1 nicht eingestellt ist, sodass Sie Befehle ohne Eingabeaufforderung eingeben.

Dies hat den Vorteil, zerstörungsfrei zu sein.

Dennis Williamson
quelle
1
Das funktioniert nicht, es für eine erfolgreiche Anmeldung zuerst versucht, kann aber nicht anmelden, und kann daher nicht bash --norc läuft
Tom Ritter
2

Versuchen

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

^ C gibt es Kontrolle-v dann c

user161180
quelle
1
Es ist Strg-V und Strg-C auf meinem System. Danke trotzdem! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
wytten
quelle
Dies funktionierte für mich in einer sehr eingeschränkten Umgebung, als nichts würde. Ich musste den vollständigen Pfad zu .bashrc angeben.
Zbeekman
1

Das Mischen von Strg-C funktioniert so lange, wie Sie ein Strg-C eingeben können, bevor die .bashrc-Datei beendet wird. Leider kann dies schwierig sein, wenn exitdie .bashrc-Datei zu Beginn vorliegt.

Sie können ein Strg-C so schnell wie möglich einfügen, indem Sie es direkt an ssh leiten:

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

Beachten Sie, dass Sie die ^CTastenkombination Strg-V gefolgt von Strg-C verwenden.

Dies leitet ein einzelnes Strg-C weiter, gefolgt von Eingaben vom steuernden Terminal, während die -ttZuweisung eines Pseudo-Terminals erzwungen wird. Alles in allem erhalten Sie eine (etwas fehlerhafte) Shell auf dem Remotecomputer, während Sie so viel .bashrc wie möglich umgehen.

Chris
quelle
0

Sie können .bash_profilemit dem scpBefehl versuchen, die mit einer leeren Datei zu überschreiben . Nach dem, was ich gegoogelt habe, verwendet scp ein nicht interaktives Login, das nicht liest .bash_profile.

Laurent Etiemble
quelle
Es sei denn, ich erinnere mich (hypothetisch) an die falsche Verzeichnisstruktur, und das gibt mir keinen Fehler, funktioniert dies nicht - scp führt auch die Datei (en) aus.
Tom Ritter
1
Was die Leute nicht merken, ist, dass scp nichts Besonderes ist. es ist nur ein weiterer Befehl, der über ssh ausgeführt wird - was bedeutet, dass nahezu alles, was für eine interaktive ssh-Sitzung geschieht, auch mit scp geschieht.
Larsks
was ist mit sftp, afaik es ist ein ssh-subsystem.
Allo
0

Sie können die bashrc-Datei auch einfach löschen:

ssh <hostname> rm ~/.bashrc
Sybreon
quelle
Das Problem liegt in der Datei .bash_profile, nicht im bashrc.
Laurent Etiemble
1
Dies funktioniert nicht - es versucht zuerst eine Shell und schlägt fehl.
Tom Ritter
0

Wenn Ihr System normal eingerichtet ist, wird .bash_profile nicht für eine nicht interaktive Shell ausgeführt (z. B. einen Befehl ausführen).

Versuchen Sie, das Problem aus dem Weg zu räumen, da sich das Problem in der Datei .bash_profile befindet:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"
Lockie
quelle
Ich habe nicht gedacht, welche Art der Verknüpfung der Dateien von Bedeutung ist - .bash_profile enthält .bashrc = (Ich habe weitere Informationen hinzugefügt.
Tom Ritter
1
Was Lockie jedoch vorschlägt - was von der Bash-Manpage bestätigt wird - ist, dass eine nicht interaktive Shell weder .bashrc noch .bash_profile ausführt. Sogar wenn Sie Befehle über die ssh-Befehlszeile übergeben (wie in diesem Beispiel), wird bash immer noch als "interaktive" Shell gestartet, was bedeutet, dass Ihre .bashrc-Datei gelesen wird. Also eine gute Idee, aber leider kooperiert ssh nicht.
Larsks
0

UH = 'user @ host'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Bitte nicht ausschneiden und ausführen, ändern userund hostdann bearbeiten letmeinund speichern unter.bashrc

SpiesInOrbit
quelle
0

Ein großes Lob an user60069, es hat bei mir funktioniert, aber ich verwende die Shell-spezifische Startdatei .bashrc, so dass die Anmeldung mit / bin / sh bei mir funktioniert hat.

Wenn Sie sich jedoch in einer Situation befinden, in der Sie kein Glück haben, biete ich diese Lösung an, die auf den Lösungen von user60069 und Dennis W basiert:

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

Dennis W bot die Option --norc an, von der jemand sagte, dass sie bei ihnen nicht funktioniere.

Führen Sie "man bash" oder "man (your shell)" aus, um Optionen zum Deaktivieren der Startdateien zu erhalten. Sie müssen nur eine abscheuliche Shell verwenden, um das Problem zu beheben.

Jim
quelle
0

Eine andere Möglichkeit, sich auf dem Server anzumelden, ist ohne Profil. Den folgenden Befehl finden Sie
ssh -t user@host bash --noprofile

Für AWS mit PEM-Datei und keinem anderen Benutzer
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Hoffe das hilft!

Krutarth Shah
quelle
-1

Nach den oben gegebenen Vorschlägen und Antworten würde ich sagen, dass es sich nicht um die Dateien .bashrc oder .bash_profile handelt. In der ssh-Manpage heißt es auch, dass Ihre Profildateien nicht gelesen werden, wenn Sie einen auszuführenden Befehl angeben.

Ich würde vorschlagen, eine andere Login-Shell (ksh? Csh? Sh?) Als den absoluten Pfad auszuführen. Beachten Sie auch, dass es sich möglicherweise um ein völlig anderes Problem handelt (Quota? Ausführungs- und Leseberechtigung für Ihr Basisverzeichnis?). Daher ist ein Nebenansatz besser. Können Sie einen anderen Benutzer bitten, ein zu tun ls -la $YOUR_HOME_DIRund Ihnen das Ergebnis zu mailen?

Lorenzog
quelle