GUI auf einem Rootserver vom eigenen Rechner aus steuern?

  • Hey all,

    ich habe Programm in AutoIt geschrieben, das auf meinen Rootserver läuft (permanent). Darauf muss ich in unregelmäßig häufigen Abständen zugreifen und hier und da mal einen Button klicken.
    Das Programm läuft fehlerfrei. Um mir jedoch die ewige "Hin-und-her-tabberei" von meinem Desktop zum Root und wieder zurück zu ersparen, würd ich das gern so realisieren, dass ich mir ein Programm schreibe,
    mitdem ich von meinem eigenen Rechner aus zumindest die wichtigsten Buttons klicken kann.

    1. Hoffe ich, dass ihr versteht was ich meine (nicht sicher, ob ich mich deutlich genug ausgedrückt hab)
    2. Ist das überhaupt möglich?

    mfG Lottich

  • Moin, also du könntest eine TCP Verbindung zu deinem Programm auf dem RootServer aufbauen und diesem dann bestimmt Commands schicken, nachdem er diese Empfangen hat soll er gewisse Aktionen ausführen, würde das ganze aber dann in Verbindung mit einem VPN Tunnel realisieren, und über diesen die Commands an den Server übertragen

    Gruß Marvin

  • Hi Marvin,
    das wäre sicher die sauberste Lösung, da hast du recht, aber die NCP Primärverbindung liegt in einem outgesourcten Rechenzentrum und lässt keine WOL Pakete oder ähnliches in unser Netz durch. Das ist verboten! Rechenzentrumsparanoia!!
    Ich muss da leider am Client ansetzen und den eben am Schlafen hindern.
    Gruß
    Guido

  • Hi Marvin,
    das wäre sicher die sauberste Lösung, da hast du recht, aber die NCP Primärverbindung liegt in einem outgesourcten Rechenzentrum und lässt keine WOL Pakete oder ähnliches in unser Netz durch. Das ist verboten! Rechenzentrumsparanoia!!
    Ich muss da leider am Client ansetzen und den eben am Schlafen hindern.
    Gruß
    Guido


    Was bitte hat das mit meinem Topic zu tun??

    @Marvin
    Danke für den Tip. Muss ich dafür das Programm vom Server umschreiben, damit TCP funktionieren kann?

  • Hallo Lottich,

    Zitat

    Muss ich dafür das Programm vom Server umschreiben, damit TCP funktionieren kann?

    Ja, aber das ist nicht sonderlich schwer.
    Schau dir doch mal die Client/Server-Beispielscripte aus der Hilfe an. Beim

    [autoit]

    TCPRecv

    [/autoit]

    findest du den Server, bei

    [autoit]

    TCPSend

    [/autoit]

    den Client.
    In deinem konkreten Fall würde ich per TCP nur eine kurze Sequenz (es reicht ja ein einzelner Buchstabe) an den Server schicken. Dieser fragt in einer Schleife die "lokale Tastatur" und gleichzeitig den TCP-Puffer ab.

    [autoit]

    If $Button1 or $tcprecv="B" Then _Function_Button1_pressed()

    [/autoit]
  • Neben den zwingend notwendigen Änderungen am Server Programm sollte man dann natürlich auch die Firewallfreigabe am Server nicht vergessen und darauf achten, dass der Serverport nur von deiner eigenen Anwendung genutzt wird (ansonsten kann es Komplikationen geben). Da Rootserver oft auch Portscans und diversen Angriffen ausgesetzt sind empfehle ich aber eine etwas komplexere "Sprache" als nur einen einzigen simplen Buchstaben zu verwenden (am besten mit Authentifikation / API Key und Verschlüsselung), damit es nicht zu unbeabsichtigter Interaktion durch dritte mit deinem Programm kommt.

    Aber ich würde mir sofern du einen 2008 R2 Server hast mal die RemoteApp Funktion ansehen, das ermöglicht es dir Programme auf dem Server inklusive GUI so auszuführen, dass diese sich nicht von lokalen Programmen auf deinem Client PC unterscheiden. ;)

    http://www.youtube.com/watch?v=7KKtTw5RTCc
    http://www.youtube.com/watch?v=mmVbzEhGHJY&feature=related

    Hab das selbst bisher nie getestet, find ich aber sehr interessant.

  • Leider stehen mir scheinbar nicht alle Serverrollen zur Verfügung, hab nur 2 zur Auswahl und das mit dem "Remote-Kram" ist leider nicht dabei 8|
    Also mach ich das über TCP. Das muss ich aber erst üben, damit ich in meinem "Serverprogramm", was ich für TCP verändern muss, auch weiss, was ich mache. Deshalb mach ich das erstmal mit nem neuen Script.

    Habe den TCP-Server und die Client-GUI erstellt und es funktioniert auch. Aber habe bereits jetzt schon 2 Fehler (eher Fehlverhalten) im Client-GUI gefunden, wo ich nicht weiss, wie ich diese fixen kann/soll.

    Fehler 1:
    Will ich einen empfangenen Text us dem Editfeld markieren, dann verschwindet der einfach während ich mit gedrücktem Mausbutton über den Text fahre, obwohl ich das Feld auf readonly gesetzt hab!

    Fehler 2:
    In der Funktion _eingabe_senden() krieg ich es nicht gebacken, dass wenn der String keine Werte enthält, die Message nicht gesendet wird. z.B 4x Leerzeichen wird gesendet. Dachte mir, dass ich das am besten mit
    StringToBinary() lösen kann, aber hab grad kein Plan wie es weiter gehen soll... Die Binärdaten eines Leerzeichens sind glaub ich "0x20" und viele Leerzeichen "0x2020202020 ..."
    Wie kann ich sicherstellen, dass die Message NUR DANN gesendet wird, wenn im Inputfeld auch tatsächlich was geschrieben wurde?

    Werft doch bitte mal nen Blick drauf.

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $programmname = "Name des Programms"
    Global $user = @UserName
    Global $server_IP = "ServerIP"
    Global $server_Port = 5555
    Global $gui_breite = 400
    Global $gui_hoehe = 700
    Global $check_interval = 2 ;in Sekunden

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

    TCPStartUp ()
    Global $Socket = TCPConnect($server_IP ,$server_Port)
    If @error Then Exit

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

    #region GUI (im Splash-Style) wird erstellt und einige Events gesetzt
    Global $mainframe = GUICreate($programmname,$gui_breite,$gui_hoehe,-1,-1,$WS_POPUPWINDOW,$WS_EX_CONTROLPARENT)
    GUISetBkColor(0xB6DBFD)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_special")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_special")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_special")
    #endregion

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

    #region Titel und User anzeigen und Exit-Button erstellen
    Global $header = GUICtrlCreateLabel($programmname & " ==>> " & $user ,10,5,$gui_breite - 30)
    GUICtrlSetFont($header,12)
    Global $button_exit = GUICtrlCreateButton("X",$gui_breite-20,0,20,20)
    #endregion

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

    #region Controls für die Kommunikation mit dem Server
    Global $Edit1 = GUICtrlCreateEdit("", 10, 40, 380, 265,$ES_READONLY)
    Global $Input1 = GUICtrlCreateInput("", 10, $gui_hoehe - 31, 320, 21)
    Global $button_senden = GUICtrlCreateButton("Send", 340, $gui_hoehe - 31, 50, 21, 0)
    GUICtrlSetOnEvent($button_senden, "_eingabe_senden")
    #endregion

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

    Func _special()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit
    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    EndSelect
    EndFunc

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

    Func _eingabe_senden()
    $Message1 = GUICtrlRead($Input1)
    $buffer = StringToBinary($Message1) ;Will nicht, dass nur Leerzeichen gesendet werden
    ;deshalb soll die Eingabe daraufhin geprüft werden.
    If Not $buffer = "" Then
    TCPSend($Socket,$user & " : " & $Message1 & @LF)
    GUICtrlSetData($Input1,"")
    EndIf
    EndFunc

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

    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit
    Case $button_senden
    _eingabe_senden()
    Case $button_exit
    TCPShutdown()
    Exit
    EndSwitch

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

    $Message2 = TCPRecv($Socket,2048)
    GUICtrlSetData($Edit1,$Message2,1)
    WEnd
    TCPShutdown()

    [/autoit]


    Grüsse, Lottich