2016-04-12 5 views
1

Ich schreibe ein Skript, das Paramiko verwendet, um ssh auf mehrere Remote-Hosts und führen Sie ein paar Überprüfungen durch. Einige Hosts werden als Failover für andere eingerichtet, und ich kann nicht feststellen, welche verwendet werden, bis ich versuche, eine Verbindung herzustellen. Beim Verbinden mit einem dieser "inaktiven" Hosts teilt mir der Host mit, dass Sie eine Verbindung zu einer anderen "aktiven" IP herstellen müssen und schließen Sie dann die Verbindung nach n Sekunden. Dies scheint auf den Stand der SSH-Verbindung/-Sitzung geschrieben zu sein (d. H. Es handelt sich nicht um ein SSH-Banner).Paramiko get stdout vom Verbindungsobjekt (nicht exec_command)

Ich habe Paramiko ziemlich oft verwendet, aber ich weiß nicht, wie ich diese Ausgabe von der Verbindung bekomme, exec_command gibt mir natürlich stdout und stderr, aber der Host gibt dies sofort nach der Verbindung aus, und es akzeptiert keine weiteren eingehenden Anfragen/Nachrichten. Es schließt nur nach n Sekunden.

Ich möchte nicht bis zum Timeout warten müssen, um auf den nächsten Host zu gehen und ich möchte auch überprüfen, dass das der Grund dafür ist, dass ich keine Verbindungen herstellen und die Prüfungen ausführen kann, sonst funktioniert mein Skript beabsichtigt.

Alle Vorschläge, wie ich diese Ausgabe erfassen kann, mit oder ohne Paramiko, wird sehr geschätzt.

Antwort

0

Ich fand einen Weg, um die Daten zu bekommen, es war ziemlich geradlinig um ehrlich zu sein, wenn auch ein wenig hackish. Dies funktioniert möglicherweise nicht in anderen Fällen, insbesondere wenn es Latenz gibt, aber ich könnte auch falsch verstehen, was passiert:

Wenn die Verbindung öffnet, spuckt der Server zwei Nachrichten, eine sagt, es kann nicht zu einem bestimmten Verzeichnis chdir , dann ein paar Millisekunden spuckt es eine andere Nachricht aus, die besagt, dass Sie sich mit der anderen IP verbinden müssen. Wenn ich einen Befehl sofort nach der Verbindung sende (egal welcher Befehl), interpretiert exec_command diese zweite Nachricht als Antwort. So, jetzt habe ich eine Lösung für mein Problem, wie ich diese Zeichenfolge für eine bekannte Nachricht überprüfen und den Ablauf der Ausführung ändern kann.

Wenn jedoch das, was ich beschreibe, korrekt ist, funktioniert dies möglicherweise nicht in Situationen, in denen zu viel Latenz vorhanden ist und der Testbefehl nicht gesendet wird, bevor die Serverantwort empfangen wurde.

Soweit ich sagen kann (und ich kann sehr falsch liegen), gibt es derzeit keine geeignete Möglichkeit, den Stdout-Stream sofort nach dem Öffnen der Verbindung mit Paramiko zu erhalten. Wenn jemand einen Weg kennt, lass es mich wissen.

Verwandte Themen