SSH Tunnel über CMD

  • Hallo,

    ich komme bei meinem Script nicht weiter. Ich versuche über die Windows CMD plink zu starten und mich dort anzumelden. Naja eiglt versuche ich es nicht es hat geklappt. Jedoch verlangt das fertige Script später das ich auf unterschiedliche Server verbinden muss.

    Nun habe ich das Problem das mein Script ständig eine neue CMD dafür öffnet und man damit quasi nach und nach den Bildschirm vollpflastert je öfter man drauf angewiesen ist.^^

    Ich habe versucht das ganze mit If WinExist zu lösen aber irgendwie wird das einfach ignoriert.
    Außerdem habe ich versucht das CMD während des Einloggens zu verstecken das der User quasi nichts von den Daten sieht die da gesendet werden oder wenigstens minimiert, allerdings ohne Erfolg. Fenster muss sichtbar sein damit die Login Daten übermittelt werden können.

    Hier die Problemzone:

    [autoit]

    If not FileExists(@ScriptDir & "\plink.exe") Then
    MsgBox(48,"Fehler","Achtung plink.exe befindet sich nicht im gleichen Verzeichniss wie dieses Programm." & @CRLF & "Lad dir das Programm bitte runter und sorg dafür das beide Programme im selben Verzeichniss sind!")
    Exit
    Else
    $antwort = MsgBox(36,"Information","Login auf dem entsprechenden Server notwendig. Die Tastatur und Maus Eingaben werden gleich für einige Sekunden gesperrt. Weiter machen?") ;fragt nach, antwort möglichkeit ja (6) oder nein (7)
    If $antwort = 6 Then ;wenn antwort ja (6) dann...
    $root = "HIER DER SERVER"
    AutoItSetOption("WinTitleMatchMode",2)
    #requireAdmin ;fragt unter vista nach ob das programm als admin ausgeführt werden soll
    If Not WinExists("\system32\cmd.exe") Then
    $block = Blockinput(1) ;sperrt die nutzereingaben
    If $block = 1 Then ;wenn die eingaben gesperrt sind dann....
    ShellExecute("cmd.exe", "", @SystemDir)
    WinActivate("\system32\cmd.exe")
    Sleep(1000)
    Send("cd " &@ScriptDir &"{Enter}")
    Sleep(500)
    Send("plink.exe -L 3306:localhost:3306 "& $root &"{Enter}")
    Sleep(500)
    WinActivate("\system32\cmd.exe") ;sicherstellung das cmd aktiv ist zum senden des acc pw
    Send("PW FÜR DEN ACCOUNT{Enter}")
    BlockInput(0) ;entsperrt die nutzereingaben
    Else ;wenn die eingaben nicht gesperrt sind dann...
    MsgBox(48,"Fehler","Eingaben konnten nicht gesperrt werden. Programm wird beendet.")
    Exit
    EndIf
    ElseIf WinExists("\system32\cmd.exe") Then
    $block = BlockInput(1)
    If $block = 1 Then
    WinActivate("\system32\cmd.exe")
    Sleep(500)
    Send("Exit{Enter}")
    Sleep(500)
    Send("cd " &@ScriptDir &"{Enter}")
    Sleep(500)
    Send("plink.exe -L 3306:localhost:3306 HIEr DER SERVER{Enter}") ; Verbindungskomando mit dem entsprechenden Server
    Sleep(1000)
    WinActivate("\system32\cmd.exe")
    Send("PW FÜR DEN ACCOUNT{Enter}")
    BlockInput(0)
    EndIf
    EndIf
    ElseIf $antwort = 7 Then ;wenn antwort auf die frage oben nein (7) dann...
    Exit
    EndIf
    EndIf

    [/autoit]

    Später wenn das läuft wollte ich darauf ne Funktion machen das ich das nicht immer wieder kopieren muss, Daher $root zum einfachen wechseln des Servers auf den verbunden werden soll.
    Hoffe jemand hat Rat. Habe es wirklich schon oft probiert und umgeschrieben.

    Danke schonmal.

    Einmal editiert, zuletzt von Streat (10. August 2010 um 22:39)

  • Du kannst plink auch direkt per Run starten und dann mit StdinWrite schreiben und StdoutRead lesen. Nach dem beenden dann StdioClose aufrufen.

  • Ok das starten per run geht, nur wie sende ich dann die Loginbefehle?

    Außerdem kann man plink scheinbar nur über die CMD bedienen. Wenn ich es so per Autoit öffne schließt es sich sofort wieder. Das gleiche wenn ich es selber unter Windows starte. ?(

  • Das hilft mir leider nicht weiter, das Problem ist, wenn ich cmd mit run starte kriege ich nichts an das Fenster gesendet. Das geht komischerweise nur mit

    [autoit]

    ShellExecute("cmd.exe", "", @SystemDir)
    WinActivate("\system32\cmd.exe")

    [/autoit]

    Ich habe es testweise mit run so gemacht:

    [autoit]

    AutoItSetOption("WinTitleMatchMode",2)
    #requireAdmin ;fragt unter vista nach ob das programm als admin ausgeführt werden soll
    $test = Run("cmd.exe",@SystemDir)
    WinActivate("\system32\cmd.exe")
    Sleep(1000)
    StdinWrite($test,"just a test")

    [/autoit]

    Habe ich einen Fehler drin den ich übersehen habe?

  • Weshalb willst du denn an so ein olles fenster senden??
    Benutz doch einfach die Parameter, um beim Ausführen Anmeldenamen, Passwort etc zu übergeben.

    21 is only half the truth.

  • Ich brauche plink um mich mit dem Server verbinden zu können. Und plink kann man nicht einfach so starten. Über plink sollen dann die Befehle an den MySql Server gesendet werden.

    Zitat: Plink is a command line application. This means that you cannot just double-click on its icon to run it and instead you have to bring up a console window.

    Daher die CMD. Wie gesagt im Grund klappt es ja soweit mit meinem Script. Nur die Abfrage nicht ob nicht schon ein plink Fenster besteht. Wenn ich also den Server wechsel um mich mit dem zu verbinden, öffnet er ein neues plink Fenster. Ich könnte diese zwar von Hand schließen allerdings ist das ja unschön. Daher wäre es schön wenn jemand das Script mal durchschauen könnte das ich am Anfang gepostet habe.

    Oder Mahagon zu zeigst mir mal einen Beispiel Code zum übermitteln der Logindaten. Denn bei der AutoIt Hilfe finde ich nichts dazu oder ich übersehe es einfach. ?( :pinch:

  • Hier mal ein Beispiel mit einer WTS Verbindung unter SSH :)

    [autoit]

    $sSSHHOST = "Feste öffentliche IP / DynDNS"
    $sSSHUSERNAME = "SSH Benutzername"
    $sSSHPASSWORD = "SSH Passwort"
    $sSSHQUELLPORT = Random(50000,54000,1)
    $sSSHTUNNELIP = "IP des Ziels (Server, Router...)"
    $sSSHPORT = "SSH Port"
    ShellExecute(@ScriptDir & "\plink.exe",$sSSHUSERNAME & "@" & $sSSHHOST & " -pw " & $sSSHPASSWORD & " -L " & $sSSHQUELLPORT & ":" & $sSSHTUNNELIP & ":" & "3389" & " -P " & $sSSHPORT & " -N")

    [/autoit]

    21 is only half the truth.

  • Ok danke, ich habe die Daten zum testen mal fest eingegeben:

    [autoit]

    ShellExecute(@ScriptDir & "\plink.exe","root" & "@" & "IP ADRESSE DES SERVERS" & " -pw " & "PASSWORT DES ROOT ACC" & " -L " & "3306" & ":" & "localhost" & ":" & "3389" & " -P " & "22" & " -N")

    [/autoit]

    Plink bleibt schonmal geöffnet das ist ja schonmal was :D allerdings geht es nur bis Using Username: root und das wars dann. Mir sagt das Verbindungskommando leider herzlich wenig da ich mich damit nicht auskenne. Ist ein Fehler drin?

    Das was ich vorher benutzt habe war ja dieses:

    Send("plink.exe -L 3306:localhost:3306 root@IP DES SERVER{Enter}")

  • Kann mir niemand außer Mahagon weiterhelfen? Scheint ja fast so das sich hier auch keiner damit auskennt :(

  • [autoit]

    ShellExecute(@ScriptDir & "\plink.exe","root" & "@" & "IP ADRESSE DES SERVERS" & " -pw " & "PASSWORT DES ROOT ACC" & " -L " & "3306" & ":" & "localhost" & ":" & "3389" & " -P " & "22" & " -N")

    [/autoit]

    Der port 3389 ist der port für den Mstsc ;)
    Die Einstellungen der Ports sind davon Abhängig was im SSH Server eingestellt ist und über welches Programm du dich verbinden willst

    Hier steht eigentlich alles was du wissen musst

    21 is only half the truth.

  • Omg ich bin so ein Schaf, das ging schon die ganze Zeit. Ich dachte der hängt weil es nur bis Using Username "root" ging... dabei war es das schon XD mehr passiert gar nicht. ^^

    Vielen Dank für deine Hilfe.

  • Hallo bin auch gerade wieder in diesem Thema unterwegs.

    Aufgefallen ist mir das es so nicht richtig ist.

    [autoit]


    ShellExecute(@ScriptDir & "\plink.exe","root" & "@" & "IP ADRESSE DES SERVERS" & " -pw " & "PASSWORT DES ROOT ACC" & " -L " & "3306" & ":" & "localhost" & ":" & "3389" & " -P " & "22" & " -N")

    [/autoit]


    müsste lauten:

    [autoit]


    ShellExecute(@ScriptDir & "\plink.exe","root" & "@" & "IP ADRESSE DES SSH-SERVERS" & " -pw " & "PASSWORT DES ROOT ACC" & " -L " & "3306" & ":" & "IP des Ziel-Servers dessen Dienst getunnelt werden soll" & ":" & "3389" & " -P " & "22" & " -N")

    [/autoit]

    Also L[lokalhost]lokal_port:remote_host:remote_port auf localhost kann verzichtet werden.

    Meine Frage ist nun wie stelle ich es an, mehrere Tunnel parallel zu erzeugen,
    für jeden Tunnel nen plink fenster kann es ja nicht sein, oder. Zumindest wenn es das gleiche externe Ziel hat.

    Wenn man die Tunnel in putty pflegt, dann ist es ja auch möglich, wie muss es also in AutoIt aussehen.
    Putty tackert die div. Tuunnel für die Verbindung wie folgt zusammen.

    L8888=192.168.123.112:3389,L7777=192.168.123.104:3389,

    Ich habe auch versuucht dann einfach die putty Session als Host zu nutzen wollte aber auch nicht klappen.

    Bevor ich mich daran weiter fest beisse, wollte ich mal nachfragen ob es überhaupt so klappt oder ob man je Tunnel ein Fenster braucht.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o