Nehmen wir also an, man hat etwas in ihre eingegeben .bashrc
, das ihn (oder sie) daran hindert, sich über ssh
einzuloggen (dh der SSH-Login wird aufgrund des Fehlers in der Datei beendet). Gibt es eine Möglichkeit, sich anzumelden, ohne es auszuführen (oder .bashrc
da 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_profile
beinhaltet .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
[ -z "$PS1" ] && return
am 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.Antworten:
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.
quelle
ssh -t username@hostname /bin/sh
funktioniert bei mir.quelle
.cshrc
/.tcshrc
auch für nicht-interaktive Shell.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.
quelle
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.
quelle
Sie müssen a) die Bash starten, ohne
source
entweder~/.bashrc
oder zu wählen,~/.bash_profile
und b) da eine solche Shell keine vollständige Anmeldeshell wäre / kein tty angehängt ist, zwingen Sie ssh , ein tty anzuhängen :quelle
ls
dich selbst davon zu überzeugen, dass du dabei bist :). Beachten Sie auch, dass hier eindumb
Begriff verwendet wird, sodass Nano für mich nicht funktioniertDu hast kein Glück mehr.
Alle ssh-Befehle führen Ihre Login-Shell aus.
ssh $COMMAND
läuft$SHELL -c $COMMAND
, läuft ,scp
läuft$SHELL -c /path/to/sftp-server
einfachssh
nur deine Shell.quelle
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@host
wird ausgeführt .bash_profilessh user@host /bin/bash
wird ausgeführt .bashrc, aber es denkt, es ist nicht interaktiv (keine Eingabeaufforderung).ssh -t user@host /bin/bash
fü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@host
Entspricht 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.
quelle
/bin/sh
sie zuerst ausgeführt werden müsste , würde dies helfen, da Bash nicht geladen wird,~/.bashrc
wenn sie als aufgerufen wirdsh
. Diese Antwort ist eine Obermenge Ihrer anderen Antwort. Löschen Sie daher die andere Antwort.So etwas wie:
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.
quelle
Versuchen
^ C gibt es Kontrolle-v dann c
quelle
quelle
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
exit
die .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:
Beachten Sie, dass Sie die
^C
Tastenkombination Strg-V gefolgt von Strg-C verwenden.Dies leitet ein einzelnes Strg-C weiter, gefolgt von Eingaben vom steuernden Terminal, während die
-tt
Zuweisung 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.quelle
Sie können
.bash_profile
mit demscp
Befehl 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
.quelle
Sie können die bashrc-Datei auch einfach löschen:
quelle
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:
quelle
Bitte nicht ausschneiden und ausführen, ändern
user
undhost
dann bearbeitenletmein
und speichern unter.bashrc
quelle
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:
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.
quelle
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!
quelle
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_DIR
und Ihnen das Ergebnis zu mailen?quelle