SSH Verbindung über AutoIt

  • Hallo Leute,

    Ich suche nach einer möglichkeit eine SSH Verbindung über AutoIt zu meinem Linux Server aufzubauen, um dort z.B. einen Befehl auszuführen.

    Ich bin schon soweit, dass ich PLINK benutzen muss, dass bekomme ich soweit auch schon hin mit dem einloggen, nur das ganze Läuft über die Komandozeile, was ich sehr unschön finde. Schöner fände ich es, wenn nur Fehler bei der Verbindung oder einem Befehl ausgegeben werden, ansonsten soll nur ein "Alles klar es hat funktioniert" Button erscheinen. Darüber soll man über eine GUI einstellen können, was für Befehle ausgeführt werden sollen.

    Das ganze soll dazu dienen, auf meinem Linux Server den Apache Server oder die MySql Datenbank neu zu starten. Ich dachte das man das über Checkboxen lösen könnte.

    Ein Design der GUI habe ich hier schonmal:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form = GUICreate('Server',377,262,364,85)
    guictrlcreatebutton('Send', 18, 210, 112, 31)
    GUICtrlCreateCheckbox('MySQL', 31, 20, 101, 31)
    GUICtrlCreateCheckbox('Teamspeak 3', 32, 47, 101, 31)
    GUICtrlCreateCheckbox('Apache', 32, 80, 101, 31)
    GUICtrlCreateCheckbox('Mailserver', 191, 24, 101, 31)
    GUISetState(@SW_SHOW)

    While 1
    $Msg = guigetmsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    exit
    Endswitch
    WEnd

    [/autoit]

    Ist aber nur als Beispiel gedacht.

    Ich hoffe ihr könnt mir helfen, oder evtl. ein paar funktionen schreiben :) (z.B. wie ich über PLINK einen befehl ausführen kann)

    Mit freundlichen Grüßen

    Jared

  • Zu Plink siehe: https://autoit.de/index.php?page…link#post181252

    bzgl Checkboxen: schau dir mal die Rückgabewerte und Switch an :)

    Hier ein Beispiel bzgl Checkboxen
    [autoit]


    #include <GUIConstantsEx.au3>
    GUICreate("Form1", 140, 105, 192, 124)
    Local $Checkbox[2]
    $Checkbox[0] = GUICtrlCreateCheckbox("Checkbox1", 16, 8, 97, 17)
    $Checkbox[1] = GUICtrlCreateCheckbox("Checkbox2", 16, 32, 97, 17)
    $Button1 = GUICtrlCreateButton("Test", 16, 56, 75, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    For $i = 0 To UBound($Checkbox) -1 ;so wird jedew Checkbox geprüft
    If GUICtrlRead($Checkbox[$i]) = $gui_checked Then MsgBox(0,"","Checkbox" & $i +1 & " ist angehakt")
    Next
    EndSwitch
    WEnd

    [/autoit]

    21 is only half the truth.

    Einmal editiert, zuletzt von Mahagon (29. September 2010 um 21:52)

  • Hallo,

    schonmal danke für die schnelle Antwort :P

    Über PLINK kann ich die Verbindung schon aufbauen, aber ich finde das halt mit der CMD unschön. Das CMD Fenster soll garnicht erst aufploppen sondern einfach nur ein Befehl ausgeführt werden..

    Mfg Jared

  • plink muss laufen um die Verbgindung offen zu halten.
    Du könntest es aber mit @SW_HIDE ausblenden.
    So kannst du auch mit @SW_SHOW dann debuggen ;)

    21 is only half the truth.

  • Danke das hilft mir schonmal nur habe ich jetzt leider ein Problem:

    Das hier funktioniert, dann wird aber die CMD angezeigt:

    [autoit]

    Run("D:\Plink.exe root@host -pw password -ssh")

    [/autoit]

    Das hier funktioniert nicht, es wird keine CMD angezeigt obwohl SHOW dortsteht.

    [autoit]

    Run("D:\Plink.exe root@host -pw password -ssh", Default, @SW_SHOW)

    [/autoit]

    Und dann noch eine Frage: Wie kann ich nachträglich den "Show-Status" verändern?

    Mfg Jared

  • Hier ein kleines Beispiel dazu :)

    Spoiler anzeigen
    [autoit]

    GUICreate("", 140, 105, 192, 124)
    $Button1 = GUICtrlCreateButton("Test", 16, 56, 75, 25)
    GUISetState(@SW_SHOW)
    ShellExecute("notepad.exe")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    If ProcessExists("notepad.exe") Then ProcessClose("notepad.exe")
    Exit
    Case $Button1
    If BitAND(WinGetState("[CLASS:Notepad]"), 2) Then
    WinSetState("[CLASS:Notepad]", "", @SW_HIDE) ;versteckt das Fenster
    Else
    WinSetState("[CLASS:Notepad]", "", @SW_SHOW) ; Zeigt es wieder an
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    21 is only half the truth.

  • Danke das hilft mich schonmal für meinen Debug Modus :)

    Ich habe es jetzt sogar geschafft, dass die Verbindung im Hintergrund aufgebaut wird.

    Hier schonmal der Quelltext dazu, den ich natürlich niemandem vorenthalten möchte ;)

    Spoiler anzeigen
    [autoit]

    GUICreate("", 140, 105, 192, 124)
    $Button1 = GUICtrlCreateCheckbox("Debugmodus", 16, 56, 75, 25)
    GUISetState(@SW_SHOW)

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

    Run("E:\Plink.exe root@10.171.34.102 -pw PASSWORT -ssh", "", @SW_HIDE)

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

    ;ControlSend("

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    If ProcessExists("plink.exe") Then ProcessClose("plink.exe")
    Exit
    Case $Button1
    If BitAND(WinGetState("[CLASS:ConsoleWindowClass]"), 2) Then
    WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) ;versteckt das Fenster
    Else
    WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_SHOW) ; Zeigt es wieder an
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Und Befehle kann man sicherlich über ControlSend an das Fenster schicken, oder? Ich habe schon hier etwas gefunden, allerdings steht dort, dass ControlSend bei der CMD unzuverlässig arbeitet, gibt es eine alternative zu ControlSend?

    Mit freundlichen Grüßen

    Jared

  • *push* ^^

    Ich habe mir jetzt nochmal die Funktion StdinWrite angeschaut, aber irgendwie komme ich damit nicht ganz klar. Und zwar wird jetzt bei mir garkeine Konsole mehr angezeigt.....

    hier mal mein Quelltext der Kompletten GUI (habe ich noch etwas verbessert)

    Spoiler anzeigen
    [autoit]


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

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Serververwaltung", 228, 109, 376, 188)
    $Button1 = GUICtrlCreateButton("Neustarten", 8, 80, 217, 25, $WS_GROUP)
    $Apache = GUICtrlCreateCheckbox("Apache", 8, 8, 105, 17)
    $MySql = GUICtrlCreateCheckbox("MySql", 8, 32, 105, 17)
    $Mailserver = GUICtrlCreateCheckbox("Mailserver", 8, 56, 105, 17)
    $Ts3 = GUICtrlCreateCheckbox("Ts3", 120, 32, 105, 17)
    $FTP_Server = GUICtrlCreateCheckbox("FTP Server", 120, 8, 105, 17)
    $Debug = GUICtrlCreateCheckbox("Debug", 120, 56, 105, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; Variablen
    $pPath = "E:\Plink.exe"
    $pHost = "10.171.34.102"
    $pUser = "root"
    $pPass = "linux"

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

    ; Funktionen
    Func _debug()
    If BitAND(WinGetState("[CLASS:ConsoleWindowClass]"), 2) Then
    WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) ;versteckt das Fenster
    Else
    WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_SHOW) ; Zeigt es wieder an
    EndIf
    EndFunc

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

    Func _apache()
    $befehl = "/etc/init.d/apache2 restart"

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

    EndFunc

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

    Func _mysql()
    $befehl = "/etc/init.d/mysql restart"

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

    EndFunc

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

    Func _mailserver()
    $befehl_dove = "/etc/init.d/dovecot restart"
    $befehl_post = "/etc/init.d/postfix restart"

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

    EndFunc

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

    Func _TS3()
    $befehl_ts31 = "su ts3"
    $befehl_ts32 = "./"

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

    EndFunc

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

    Func _FTPServer()
    $befehl = "/etc/init.d/ restart"

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

    EndFunc

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

    Local $foo = Run(@ComSpec & " /c " & $pPath & " " & $pUser & "@" & $pHost & " -pw " & $pPass & " -ssh", Default, @SW_SHOW, $STDIN_CHILD)

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

    StdinWrite($foo, "Hallo123456789")
    StdinWrite($foo)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Debug
    _debug()
    Case $Button1

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

    MsgBox(0, "Debug", $data)

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

    EndSwitch
    WEnd

    [/autoit]

    Ich hoffe ihr könnt mir helfen :)

    Mfg Jared

  • Moin,
    Du hast ein Denkfehler drin.
    Du willst eine Console aufmachen und dann die Kommandos per send-Befehl ausführen lassen.

    Plink funtioniert aber so:
    $sPlinkCommand=plink.exe -batch -pw password username@url.de ./<linux commandos> <parameter>

    Im DOS Fenster kannst du Dir das Ergebnis anschauen.

    Ich habe es so gelöst:
    $sPlinkReturn = _getDOSOutput($sPlinkCommand)
    If $sPlinkReturn == "Mandant " & $Mandant & "erfolgreich aktualisiert" Then
    .....

    Func _getDOSOutput($sCommand)
    Local $sTmp = '', $Pid = Run('"' & @ComSpec & '" /c ' & $sCommand, @ScriptDir, @SW_HIDE, BitOr($STDERR_CHILD, $STDOUT_CHILD, $STDIN_CHILD))
    While 1
    If StdoutRead($Pid, True) Then $sTmp &= StdOutRead($pid)
    If StderrRead($Pid, True) Then $sTmp &= StderrRead($pid)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $sTmp
    EndFunc ;==>_getDOSOutput

    Vielleicht hilft es Dir weiter,
    Paule