Seltsames SSH-Problem, ssh funktioniert mit -t, friert aber ohne ein

13

Wenn ich mich sshauf einem meiner Server anmelde, scheint es sich anzumelden, hängt sich dann aber auf, bevor ich die Eingabeaufforderung erhalte ( message debug2: shell request accepted on channel 0 is the last log entry).

Obwohl die seltsame Sache ssh -t "/bin/bash"funktioniert, wenn sshnicht.

Was ich bisher herausgefunden habe

  • Ich kann mich normalerweise von Servern am selben geografischen Standort aus problemlos anmelden
  • Wenn ich ssh -t '/bin/bash'mich von JEDEM Ort aus perfekt einloggen kann.
  • Wenn ich rsync an den Server gewöhne, scheint es zu funktionieren und sperrt dann
  • Wenn ich rsync vom Server verwende, funktioniert es problemlos

Was ich probiert habe

  • Entfernen oder Ändern aller Anmeldeoptionen .profile,.bashrc /etc/profile
  • Ändern des ssh_config und / oder sshd_config eines von einem identischen Server, der gut funktioniert
  • Ich habe das Routing überprüft
  • Ich habe einen Netzwerkexperten vergeblich untersuchen lassen tcpdump(obwohl es anscheinend viele Neuübertragungen gibt)

Mir fällt wirklich nichts anderes ein

Abgesehen von einem zwielichtigen Netzwerkkartentreiber / Firmware.

MisterG
quelle
Gibt es irgendwelche matchAussagen in sshd_config? Läuft nur eine Instanz sshd?
Hauke ​​Laging
3
Was passiert, wenn Sie von lokal ssh? Von einer VM, die auf derselben physischen Maschine gehostet wird? Aus demselben Netzwerksegment? Wenn Sie eine andere Instanz von sshd auf einem anderen Port ausführen? Haben Sie etwas ungewöhnliches in .ssh/authorized_keyswie command=…? Haben Sie alle Firewall-Regeln durchgesehen, um festzustellen, ob versehentlich einige SSH-Pakete blockiert wurden?
Gilles 'SO- hör auf böse zu sein'
1
Können Sie Strg + C drücken, während die SSH-Verbindung hängt, und eine Eingabeaufforderung erhalten? Die Eingabeaufforderung wird nicht Ihre normale Eingabeaufforderung sein. Wenn dies das Problem ist, liegt wahrscheinlich ein Problem in Ihren /etc/profile.d/*oder /etc/bashrcDateien vor.
SLM
1
Drückt man "<Enter> ~?" irgendwas tun? Das sind drei Tastendrücke, geben Sie das Tilde-Fragezeichen ein.
Godlygeek
1
Wenn Sie sich anmelden können, wie lautet Ihre Standard-Shell in / etc / passwd? Wenn Sie sich mit der Bash-Shell anmelden können, scheint die Standard-Shell eine andere als die Bash-Shell zu sein.
Warwick

Antworten:

5

Das kann an einem Problem im Profil liegen.
Wenn Sie sich mit ssh -t /bin/bash Ihrer Shell verbinden, wird sich weder 'einloggen', /etc/profilenoch die ~/.profileund ~/.bashrc...

Versetzen Sie die Shell nach dem Herstellen der Verbindung in den Debug-Modus und geben Sie für jede Datei einen Quellcode ein, um festzustellen, was darin blockiert:

set -x 
. /etc/profile 
...and so on

BEARBEITEN

Beachten Sie, dass ich mich geirrt habe. Die .bashrc-Datei wird von jeder interaktiven Shell bezogen (daher ist hier nur das Profil, die profile.d-Dateien von Bedeutung).

Versuchen Sie, die Liste der verschiedenen Phasen des Verbindungsprozesses zu erstellen. Etwas wie das

1) ssh verbindet (config, ...)
2) login (PAM, tty, wtmp, ...)
3) Starten der Shell (profile, home dir access, ...)

Zum Überprüfen von (1) können Sie den sshd-Daemon im Debug-Modus starten. Dazu müssen Sie einen anderen sshd starten und einen dedizierten Port abhören (nicht an Port 22, daher müssen Sie den regulären sshd-Daemon nicht anhalten).

# /usr/sbin/sshd -p 2222 -ddd 

Das sshd akzeptiert nur eine Verbindung und geht nicht in den Hintergrund. Öffnen Sie ein anderes Terminal und stellen Sie eine Verbindung zu dieser SSH-Sitzung her.

# ssh -vvv -p 2222 user@host

Sie können die Nachrichten, die Sie erhalten, mit denen eines anderen Servers der gleichen Marke vergleichen. Dann werden Sie wissen, ob das Problem auf der SSH-Seite liegt oder nicht.

(-ddd und -vvv sind die maximale Debugstufe, das können Sie einstellen)

Ich habe diesen Link , viel detaillierter.

Emmanuel
quelle
Ich habe sooooo gehofft, dass dies die Antwort ist, auch wenn dies nicht der Fall ist, danke für die Erklärung des Unterschieds, da dies mir bei der Lösung des Problems helfen wird. Ich habe versucht, alle profilbezogenen Elemente zu verschieben und sogar einen leeren / root-Ordner zu verwenden, aber es hat nichts funktioniert (sogar andere Anmelde-Shells).
MisterG
2

Die Antwort auf mein Problem Es stellte sich heraus, dass es sich um ein Netzwerkproblem handelte. Ich fand schließlich heraus, dass das Problem behoben wurde, indem die MTU aller Netzwerkkarten ein wenig gesenkt wurde.

Höchstwahrscheinlich ist etwas für dieses Netzwerk falsch konfiguriert, aber das kann ich jetzt beweisen und dem Netzwerkteam übergeben (das mir immer wieder mitteilte, dass es sich um ein Serverproblem handelte).

Beachten Sie jedoch, dass dies ein letzter Ausweg ist. Die Besonderheit, die ich hatte, war, dass der SSH-Server über dasselbe Subnetz arbeitete, aber nicht außerhalb, und dass SSH-t '/ bin / bash' von überall aus funktionierte.

Ich hatte auch rsyncs, die gut anfingen würden, aber irgendwann einfach hängen oder die Verbindung trennen.

Wenn Sie sich also diese Antwort ansehen, probieren Sie zuerst die anderen oben aus, und NUR wenn Sie Seltsamkeiten wie meine bekommen, hilft dies wahrscheinlich.

Also danke für all die Hilfe. Ich habe alles ausprobiert, und es hat mir eine Menge beigebracht, und ich habe bestätigt, dass es nichts mit dem Server zu tun hat (was alles ist, was ich mir erhofft hatte).

Vielen Dank an alle, die mitgeholfen haben

MisterG
quelle
1

Wenn Sie dies tun ssh some_user@some_host /bin/bash, starten Sie die Shell /etc/passwdvon some_user (wie in some_host definiert ) und führen dann den angegebenen Befehl /bin/bashin dieser Shell aus.

Jetzt wird die Shell von some_user (nehmen wir an, es ist auch so bash) nicht interaktiv gestartet (sondern führt stattdessen den angegebenen Befehl aus). Es wird also keine Pty (ein Pseudoterminal ) zugewiesen, und das bedeutet, dass der ausgegebene Befehl keine Pty verwenden kann, sodass er nicht interaktiv gestartet wird.

In diesem Beispiel wird der angeforderte /bin/bashBefehl gestartet, scheint jedoch zu hängen.

Sie können dies beheben, indem Sie ssheine Pty erstellen, sodass eine für die Shell und ihre untergeordneten Prozesse verfügbar ist. Das ist was -ttut.

    $ ssh -t some_user@some_host bash

Sie können dies auch beheben, indem Sie den Befehl zum Erstellen einer Pty zwingen. Für bash, tun Sie dies ein , indem -iArgument. Die folgende Befehlszeile sollte ebenfalls funktionieren:

$ ssh some_user@some_host bash -i

Beachten Sie jedoch, dass in diesem letzteren Fall die Shell nicht zugreifen kann /dev/ttyund dies zu einer Warnung führt:

bash: no job control in this shell

Die Gründe hierfür werden hier erläutert . Dies kann ein Problem sein oder auch nicht, je nachdem, was Sie in der Shell vorhaben, aber ssh -twahrscheinlich ist die Verwendung die bessere Option.

(Beachten Sie, dass Sie nur bashden Befehl übergeben können, da er sich ohnehin auf dem Pfad der Standardshell des Benutzers befinden sollte.)

starfry
quelle
1

Ich habe das gleiche Problem, als ich kürzlich eine verschachtelte Virtualisierungsplattform verwendet habe.

Es funktioniert, nachdem die MTU auf dem Quell- oder Zielserver von 1500 auf 1400 reduziert wurde.

/sbin/ip link set dev eth0 mtu 1400
Wei Zhou
quelle