Ausgabe einer SSH-Sitzung bricht ab

  • Hallo Gemeinde,

    mit nachfolgendem Code baue ich eine SSH-Session zu einem KVM-Switch(Raritan DKX III 8/32) auf. Leider
    wird aber die Ausgabe nach ein paar Zeilen abgebrochen.


    Das ist die Ausgabe von ConsoleWrite Debug:

    Beim * sollten eigentlich die restlichen 30 Ports ausgegeben werden.
    Mache ich die SSH-Session(z.B. mit openssh oder Putty) manuell, wird auch die ganze Liste mit 32 Ports ausgegeben!

    Hätte jemand eine Idee wieso die Ausgabe nicht komplett ist, bzw. wie ich das hinbekomme?

  • Schon mal versucht wie in der Hilfe geschrieben mit process waitclose zzu arbeiten und dann den ganzen output zu holen?

    AutoIt
    		Local $iPID = Run(@ComSpec & ' /C DIR "' & $sFilePath & $sFilter & '" /B /A-D /S', $sFilePath, @SW_HIDE, $STDOUT_CHILD)
            ; If you want to search with files that contains unicode characters, then use the /U commandline parameter.
    
            ; Wait until the process has closed using the PID returned by Run.
            ProcessWaitClose($iPID)
    
            ; Read the Stdout stream of the PID returned by Run. This can also be done in a while loop. Look at the example for StderrRead.
            Local $sOutput = StdoutRead($iPID)

    Und ja, ich weiß das es eigentlich auch mit dem wihle gehen sollte.

  • Hmm, dann bin ich aktuell ratlos warum die Verbindung dort kappt.

    Ich hätte dann maximal die idee fürn workaround (Powershell oder cmd nutzen um es lokal in eine temporäre Datei zu schreiben) aber nichts für eine Lösungsfindung :(

  • Hallole,

    es liegt offenbar an der Session selbst. Wie ich im Taskmanager sehen konnte wird die plink.exe gestartet und schließt sich aber gleich wieder.
    Daher vermutlich die Fehlermeldung "Unable to read from standard input: Das Handle ist ungültig."

  • Das "Unable to read from standard input: Das Handle ist ungültig." kommt vermutlich daher, dass du bei RUN nur angibst, dass $STDOUT_CHILD verwendet werden soll, aber nicht der $STDIN_CHILD.
    Vielleicht will plink.exe aber beides und wirft einen Fehler, wenn kein StandardInputStream vorhanden ist.

    Probier evtl. mal: Run(@ComSpec & " /c " & $sVar4 & " " & $sKonto & "@" & $sHost & " -pw " & $sPwd, @TempDir, @SW_HIDE, BitOr($STDIN_CHILD, $STDOUT_CHILD))
    Evtl. wäre auch $STDERR_CHILD gut, ggf. merged mit dem Output, einfach damit du das auch sehen kannst:
    Run(@ComSpec & " /c " & $sVar4 & " " & $sKonto & "@" & $sHost & " -pw " & $sPwd, @TempDir, @SW_HIDE, BitOr($STDIN_CHILD, $STDERR_MERGED))

  • Hallo Moombas,

    c oder k ändern leider auch nichts. Die CMD bei @SW-Show zeigt gar nichts an egal wie...


    @ Kanashius:

    mit deinen Vorschlägen kommt das richtige Ergebnis zurück aber seltsamer weise erst wenn ich im Taskmanager die plink.exe manuell beende. ;(
    Das Handle unter $Status ist das von der CMD.
    Wenn ich im Run-Befehl die plink.exe direkt starte verhält es sich gleich. dann habe ich zwar das Handle, bzw. die PID von der plink.exe,
    diese lässt sich aber mit Processclose nicht beenden. Rückgabe PID = 0 = Fehler, @error ist aber seltsamer Weise auch 0

    Einmal editiert, zuletzt von hipfzwirgel (27. Juni 2024 um 14:11)

  • Du erstellst eine ssh session. Um die zu schließen, musst du die Verbindung trennen. Dazu kannst du das Kommando "EXIT" am Ende deines Kommandoaufrufes aufrufe, oder vermutlich auch den STD_IN nutzen.
    Das würde mit einem StdinWrite($iPid, "EXIT") funktionieren.

    ProcessClose versucht einen Prozess auf nette Art zu beenden (Sendet ein Terminations Signal an die Anwendung, die diese vermutlich ignoriert).
    Du könntest den Prozess also notfalls mit der Kommandozeile mit pskill beenden (kann auch mit AutoIt automatisiert werden).

  • Hallo Kanashius,

    danke für den Tipp. Mir war aber schon beim Lesen klar, das das eher nicht funzt.
    Auch in einer manuell aufgesetzten ssh-console zum KVM-Switch hat Exit keine Auswirkung. Ich versuche es aber noch mit pskill...

    p.s.: Die ssh-console die dieser KVM-Switch anbietet ist eine Katastrophe!!!!

  • Als ich letztens mit SSH rumgespielt habe, hatte ich mir fix folgende Funktionen zusammengestellt:

    Wie gesagt mit einer gewissen Warnung versehen, da diese wirklich nur schnell dahingeschustert sind und alles andere als optimiert.
    Aber eventuell bringt es dich doch ein Stück weiter.

    Ansonsten ist mir folgender Fallstrick begegnet: Wenn sich der Server-Key ändert oder noch nicht vorhanden ist, dann kommt man hiermit nicht weit.
    In diesem Fall manuell die Verbindung per z.B. Putty herstellen (die Keys werden für alle diese Tools in HKCU\Software\SimonTatham\PuTTY\SshHostKeys gespeichert) damit plink ein bereits bekanntes Gegenüber hat.

  • Hallo Aspirinjunkie,

    ich schaue mir das mal übers WE an. Auf jeden Fall bedanke ich mich bei dir für deinen Beitrag.
    Ich kann die SSH Session zwar mit send Strg C beenden. dann bekomme ich aber keine Ausgabe.
    Die bekomme ich nur wenn ich die While-Schleife benutze. Da fehlt mir aber die Fantasie wie ich dann
    den Strg-Befehl feuern kann...;(;(;(