Autoit SSH per Plink

  • Hallo zusammen,

    ich bin Sebastian(32) und komme aus der Nähe von Erlangen und benötige mal eure Hilfe

    Ich möchte per SSH eine Verbindung zu einem Server mit Plink öffnen.
    Dann soll stdout, stderr in eine GUI ausgegeben werden. Über diese GUI möchte ich dann auch per stdin Daten eingeben.

    Bisher kann ich den Connect durchführen und dann wird der Output im ersten Editfeld ausgegeben. Jedoch aktualisiert sich das Control permanent. Also Änderungen kann man da kaum herauslesen. Also wie kann man sich nur die Änderungen ausgeben lassen?

    Was muss ich machen, damit ich Daten abschicken kann?

    Hier mein Skript:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=e:\autoit\guis\frm_plink.kxf
    $frm_plink = GUICreate("Plinkout", 615, 439, 192, 124)
    $ed_stdOut = GUICtrlCreateEdit("", 16, 24, 585, 217)
    GUICtrlSetData(-1, "ed_stdOut")
    $ed_stderr = GUICtrlCreateEdit("", 16, 264, 585, 129)
    GUICtrlSetData(-1, "ed_stderr")
    $btn_connect = GUICtrlCreateButton("SSH Connect", 256, 408, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btn_connect
    conSSH()
    EndSwitch
    WEnd
    Func conSSH()
    $hostname = "server"
    $stream = Run(@comspec & " /k C:\Users\user\Desktop\PLINK.EXE " & $hostname & " -pw pw -l login -ssh ", "C:\Users\user\Desktop", @SW_SHOW ,$STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

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

    ;~ $out = "Output:" & @CRLF
    Local $out
    While 1
    $out &= StdoutRead($stream)
    GUICtrlSetData($ed_stdOut,$out)
    If @error Then ExitLoop
    Wend

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

    ;~ $out &= @CRLF & @CRLF & "Error:" & @CRLF
    While 1
    $out &= StderrRead($stream)
    GUICtrlSetData($ed_stderr,$out)
    If @error Then ExitLoop
    Wend
    EndFunc

    [/autoit]

    Vielen Dank schon mal

    Grüße
    Sebastian

    Einmal editiert, zuletzt von Pace17881 (7. März 2014 um 14:33)

  • Herzlich Willkommen im Forum Sebastian ;)

    Kennst du die Plink UDF? http://www.autoitscript.com/forum/topic/128310-plink-wrapper/
    Damit tust du dich vermutlich viel leichter ;)

    Problem bei deinem Script ist dass du ständig den Inhalt des Controls überschreibst, auch wenn sich garnichts ändert.
    Hier mal Zeile 30 bis 35 so angepasst das es nicht mehr blinken dürfte:

    [autoit]

    Local $out, $last
    While 1
    $out &= StdoutRead($stream)
    If @error Then ExitLoop
    if $out <> $last then
    GUICtrlSetData($ed_stdOut,$out)
    $last = $out
    endif
    Wend

    [/autoit]
  • Hallo Schnitzel :)

    vielen Dank erst mal für die Antwort.

    Den Plink Wrapper habe ich schon gesehen und nutze den auch jetzt. Mein Skript ist dahingehend angepasst.

    Nur mit dem senden von Befehlen klappts noch nicht. Wie übermittle ich denn "Enter" oder "Strg+C"

    Hier noch mein angepasstes Skript

    Spoiler anzeigen
    [autoit]

    #include <plink_wrapper.au3>
    #include <Constants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=e:\autoit\guis\frm_plink.kxf
    $frm_plink = GUICreate("Plinkout", 615, 439, 192, 124)
    $ed_stdOut = GUICtrlCreateEdit("", 16, 24, 585, 217)
    GUICtrlSetData(-1, "ed_stdOut")
    $ed_stderr = GUICtrlCreateEdit("", 16, 264, 585, 129)
    GUICtrlSetData(-1, "ed_stderr")
    $btn_connect = GUICtrlCreateButton("SSH Connect", 16, 408, 75, 25)
    $in_Input = GUICtrlCreateInput("", 256, 408, 121, 21)
    $btn_send = GUICtrlCreateButton("Send", 392, 408, 75, 25)
    $btn_close = GUICtrlCreateButton("SSH Close", 96, 408, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btn_connect
    conSSH()
    GUICtrlSetData($ed_stdOut,sendSSH(20000))
    Case $btn_send
    _Say(GUICtrlRead($in_Input))
    GUICtrlSetData($ed_stdOut,sendSSH(20000))
    Case $btn_close
    _Plink_close()
    MsgBox(0,"SSH Verbindung","geschlossen")
    EndSwitch
    WEnd

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

    Func sendSSH($delay)
    $out = _Collect_stdout($delay)
    Return $out
    EndFunc

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

    Func conSSH()
    $plinkLoc = "C:\Users\user\Desktop\PLINK.EXE"
    $plinkServ = "server -pw pw -l pw "
    $plinkHandle = _Start_plink($plinkLoc,$plinkServ)
    Return $plinkHandle
    EndFunc

    [/autoit]
  • Schau dir mal Send() bzw ControlSend() an. Sollte damit eigentlich gehen

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Worin liegt das Problem am Enter? Ein Enter auf der Console ist bei unixoiden Systemen das Zeichen @LF. Einfach das senden und gut ist.
    (das LF ist auch der einzige Unterschied zwischen _Say und _SayPlus)
    Strg+C wäre das Zeichen Chr(03). Sollte genauso funktionieren