Kommandos via Putty/Plink absetzen/auswerten

  • #Edit: Lösung wird in Zukunft noch hinzugefügt...

    Hallöchen zusammen,

    seit mehreren Tagen drehe ich mich mit meinen Gedanken im Kreis und komme auf keinen grünen Zweig. Folgend eine kurze Beschreibung meines Vorhabens...

    Edit: Kurzfassung meines Problems: Beim auslesen der DOS ausgabe mit StdoutRead klappt immer nur der erste versuch, ich brauche das aber die ganze Zeit ^^

    Ich will via SSH (Putty/Plink) auf einen Rechner zugreifen und dort Kommandos absetzen. Wichtig ist mir dass ich auslesen kann was dort passiert. Ich habe das problem, dass ich nach dem connecten gerne prüfen will ob dies geklappt hat. Das passt soweit eigentlich wenn ich z.B. mit nem RegExp auf "FATAL ERROR" prüfe. Nun wäre es allerdings an der Zeit sofern es geklappt hat ein Perl-Script anzuwerfen und dort wird quasi in die Konsole geschrieben, und somit könnte ich theoretisch diesen Text auswerten wenn ich ihn denn kriege.

    Ich habe versucht danach mit StdinWrite zu arbeiten aber irgendwie kriege ich das nicht so hin wie ich möchte. Zu Beginn habe ich auch mal einfach Putty gestartet und dann mit ControlSend gearbeitet, aber dort habe ich keinerlei Möglichkeit gefunden das Putty Fenster nach jedem Kommando auszulesen.

    Daher wäre meine Frage an euch, ob ihr mir n schlauen Tipp zum vorgehen geben könnt (sofern möglich).

    Hier mal das Verbindungsskript von mir:

    [autoit]

    Local $foo = Run(@ComSpec & ' /c "C:\Program Files (x86)\Putty\plink.exe" -v -ssh user@host:port -pw password', @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line

    [/autoit][autoit][/autoit][autoit]

    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    If $line <> '' Then
    ConsoleWrite("#STDOUT##################################" & @CR & _
    $line & @CR & _
    "################################################################################" & @CR)
    EndIf
    WEnd
    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    If $line <> '' Then
    ConsoleWrite("#STDERR#########################################" & @CR & _
    $line & @CR & _
    "################################################################################" & @CR)
    EndIf
    WEnd

    [/autoit]

    Die Traumvorstellung wäre dass ich im Putty ein Befehl absetze, und alles was dort in die Konsole geschrieben wird bis zum nächsten "user@host:~#" auch ausgelesen wird z.B. mit ner schleife dass auch nicht einfach folgende Statements abgesetzt werden obwohl da noch ein altes Skript läuft.

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (16. Januar 2014 um 11:24)

  • Danke chip. Die UDF hat ziemlich die gleichen Funktionen die ich selber schon geschrieben habe, erst ging es nicht, dann habe ich mir einige rausgeschrieben und noch noch ein wenig daran rumgeschrieben, und nun klappt es. Einen Lösungsweg poste ich noch, nur muss jetzt erstmal ganz schnell das Script hier fertig machen.

    Danke

    #Edit So geths (eine Hilfe war dei Console.au3!):

    [autoit]


    Local $iPID = Run('"C:\Program Files (x86)\Putty\plink.exe" -ssh -pw PASSWORD USER@HOST:PORT', "", @SW_HIDE, 7)
    For $i = 0 To 3
    Local $iTimeout = WinWait("C:\Program Files (x86)\Putty\plink.exe", "", 10)
    If $iTimeout <> 0 Then
    ExitLoop
    Else
    If $i = 3 Then Exit
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    $iRval = __PlinkExpect($iPID, "USER@")
    If $iRval = 0 Then
    MsgBox(48, "", 'PuTTY - Es konnte keine erfolgreiche verbindung aufgebaut werden.')
    Exit
    EndIf
    StdinWrite($iPID, "WAS AUCH IMMER IHR MACHEN WOLLT" & @CR)

    [/autoit][autoit][/autoit][autoit]

    ProcessClose($iPID)

    [/autoit][autoit][/autoit][autoit]

    Func __PlinkExpect($iPlink_PID, $sPlink_Match, $iTimeout = 30000)
    Local $sText
    Local $iRval
    Local $iTimer = TimerInit()
    Local $iTimerDiff

    [/autoit][autoit][/autoit][autoit]

    While 1
    $iTimerDiff = TimerDiff($iTimer)
    If $iTimerDiff > $iTimeout Then Return 0

    [/autoit][autoit][/autoit][autoit]

    $sText = StdoutRead($iPlink_PID)
    $iRval = StringRegExp($sText, $sPlink_Match)
    If $iRval = 1 Then ExitLoop

    [/autoit][autoit][/autoit][autoit]

    Sleep(100)
    Wend

    [/autoit][autoit][/autoit][autoit]

    Return 1
    EndFunc
    Func _PlinkExpect($iPlink_PID, $sPlink_Match)
    Local $iRvl = 0

    [/autoit][autoit][/autoit][autoit]

    While 1
    $iRval = __PlinkExpect($iPlink_PID, $sPlink_Match)
    If $iRval = 1 Then ExitLoop

    [/autoit][autoit][/autoit][autoit]

    Sleep(10000)
    WEnd
    EndFunc

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

    Einmal editiert, zuletzt von Yaerox (17. Januar 2014 um 12:56)