2014-09-01 10 views
28

Kürzlich habe ich einen Code erstellt, der eine Verbindung zur Arbeitsstation mit verschiedenen Benutzernamen (dank eines privaten Schlüssels) basierend auf Paramiko herstellt.Paramiko: Fehler beim Lesen des SSH-Protokollbanners

Ich hatte nie Probleme mit ihm, aber heute habe ich das: SSHException: Error reading SSH protocol banner

Diese seltsame ist, weil es zufällig auf irgendwelche Verbindungen geschieht. Gibt es eine Möglichkeit, es zu beheben?

+13

Dies geschieht, wenn der Server die Verbindung akzeptiert, der ssh-Daemon jedoch nicht innerhalb von 15 Sekunden antwortet. Es könnte Netzwerküberlastung, fehlerhafte Switches usw. sein, aber normalerweise bedeutet dies, dass der Zielserver festgefahren ist oder sein sshd blockiert ist. Die Wiederherstellung soll warten und es erneut versuchen. Wenn Sie den Server steuern, ist es eine gute Zeit, um seinen Zustand zu überprüfen. – tdelaney

+1

Sie können diesen Fehler reproduzieren, indem Sie 10 Threads und öffnende/schließende SFTP-Verbindungen so schnell wie möglich auf allen vornehmen. Der sshd-Daemon kann nicht rechtzeitig antworten, und die obige Ausnahme wird ausgelöst. –

+0

Ich habe gerade das Problem auf einem Server. Openssh Client verbindet sich gut, Paramiko schlägt fehl. Wenn ich den Server telnet, schreibt er nicht sofort die Zeile 'SSH-2.0-OpenSSH_6.0p1' wie alle anderen Server. Habe keine Ahnung von der Ursache. – Equidamoid

Antwort

13

Es hängt davon ab, was Sie mit "fix" meinen. Die zugrunde liegende Ursache, wie in den Kommentaren hervorgehoben, sind Überlastung/Mangel an Ressourcen. Auf diese Weise ähnelt es einigen HTTP-Codes. Das ist die normale Ursache, es könnte sein, dass der ssh-Server die falschen Header-Daten zurückgibt.

429 Zu viele Anfragen, weist den Client an, die Ratenbegrenzung zu verwenden, oder manchmal geben APIs 503 auf ähnliche Weise zurück, wenn Sie Ihr Kontingent überschreiten. Die Idee ist, es später noch einmal mit einer Verzögerung zu versuchen.

Sie können versuchen, diese Ausnahme in Ihrem Code zu behandeln, warten Sie ein wenig und versuchen Sie es erneut. Sie können die Datei transport.py auch bearbeiten, um das Banner-Timeout auf einen höheren Wert zu setzen. Wenn Sie eine Anwendung haben, bei der es keine Rolle spielt, wie schnell der Server reagiert, können Sie dies auf 60 Sekunden einstellen.

+1

Wenn ich mein Programm gemacht habe, versuche es so etwas wie 500 Mal auf einer Maschine zu verbinden. Ich denke, dass der Server meinen Zugriff einschränkte, um Brute-Force-Angriffe zu vermeiden (natürlich war das nicht das Ziel meines Programms). Deine Antwort ist in meinem Fall die richtige. – FunkySayu