Run und falsche PID

  • Hey,

    ich bin gerade dabei, das Scipt von http://www.autoitscript.com/forum/topic/128310-plink-wrapper/ etwas umzubauen.

    Leider habe ich jetzt plötzlich das Problem, dass der Prozess plink.exe seine PID während der Ausführung wechselt. Dadurch funktioniert mein Script nicht mehr richtig.

    Spoiler anzeigen
    [autoit]

    Global $_plink_loc = "plink.exe"
    Global $_plink_logfile = "plink.log"
    Global $_plink_logging = False

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

    _plink_log_enable(True)
    $ssh = _plink_open("whatever", "root", "123", 3000)
    _plink_close($ssh)

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

    Func _plink_open($_plink_server, $_plink_user, $_plink_pw, $_plink_timeout)
    If $_plink_loc = "" then
    SetError(1)
    Return False
    EndIf

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

    If $_plink_server = "" then
    SetError(2)
    Return False
    EndIf

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

    $_plink_handle = Run(@comspec & " /c " & $_plink_loc & " -ssh " & $_plink_user & "@" & $_plink_server & " -pw " & $_plink_pw, @ScriptDir, @SW_MINIMIZE, 7)
    If @error Then
    SetError(3)
    Return False
    EndIf

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

    _plink_expect($_plink_handle, "(.*)*@(.*):(.*)$", $_plink_timeout)
    If @error Then
    SetError(4)
    EndIf

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

    Return $_plink_handle
    EndFunc

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

    Func _plink_close($_plink_handle)
    If Not ProcessClose($_plink_handle) Then
    SetError(1)
    Return False
    Else
    Return True
    EndIf
    EndFunc

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

    Func _plink_write($_plink_handle, $output)
    StdinWrite($_plink_handle, $output)
    EndFunc

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

    Func _plink_writeln($_plink_handle, $output)
    StdinWrite($_plink_handle, $output & @CR)
    EndFunc

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

    Func _plink_read($_plink_handle, $_plink_timeout)
    Local $text
    Local $sBuffertext
    Local $iBegin = TimerInit()

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

    While 1
    $text = StdoutRead($_plink_handle)
    If $text == "" Then ExitLoop
    $sBuffertext = $sBuffertext & $text

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

    if $_plink_logging Then
    _plink_log($text)

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

    If @error Then
    SetError(1)
    Return False
    EndIf
    EndIf

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

    If TimerDiff($iBegin) > $_plink_timeout then
    ExitLoop
    EndIf

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

    sleep(100)
    WEnd

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

    Return $sBuffertext
    EndFunc

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

    Func _plink_wait($_plink_handle, $_plink_timeout)
    Local $text
    Local $sBuffertext
    Local $iBegin = TimerInit()

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

    While 1
    $text = StdoutRead($_plink_handle)
    $sBuffertext = $sBuffertext & $text

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

    if $_plink_logging Then
    _plink_log($text)

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

    If @error Then
    SetError(1)
    Return False
    EndIf
    EndIf

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

    If TimerDiff($iBegin) > $_plink_timeout then
    ExitLoop
    EndIf

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

    sleep(100)
    WEnd

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

    Return $sBuffertext
    EndFunc

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

    Func _plink_expect($_plink_handle, $match_text, $_plink_timeout)
    Local $text
    Local $found
    Local $iBegin = TimerInit()

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

    While 1
    $text = StdoutRead($_plink_handle)

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

    If $text <> "" Then
    if $_plink_logging Then
    _plink_log($text)

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

    If @error Then
    SetError(1)
    Return False
    EndIf
    EndIf

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

    $found = StringRegExp($text, $match_text)

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

    If $found = 1 Then Return True
    EndIf

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

    If TimerDiff($iBegin) > $_plink_timeout Then
    SetError(2)
    Return False
    EndIf

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

    sleep(100)
    WEnd
    EndFunc

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

    Func _plink_log_enable($enable)
    $_plink_logging = $enable
    EndFunc

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

    Func _plink_log($_plink_log_text)
    $_plink_logfile_handle = FileOpen($_plink_logfile, 1)
    If $_plink_logfile_handle = -1 Then
    SetError(1)
    Return False
    EndIf

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

    If FileWriteLine($_plink_logfile_handle, @HOUR & ":" & @MIN & ":" & @SEC & " - " & $_plink_log_text) = False Then
    SetError(2)
    Return False
    EndIf

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

    If FileClose($_plink_logfile_handle) = False Then
    SetError(3)
    Return False
    EndIf
    EndFunc

    [/autoit]


    Hat jemand vllt. eine Ahnung, woran das liegen könnte? Vielen Dank :)

    2 Mal editiert, zuletzt von GtaSpider (28. November 2014 um 19:35)

    • Offizieller Beitrag

    Hallo

    Zu aller erst: Ein Prozess kann seine PID nicht ändern. Entweder startet die EXE sich selber neu (und bekommt somit eine neue PID zugewiesen) oder sie behält ihr PID.

    Bei dir ist es ein wenig was anderes. Du startest das Programm mit @ComSpec und dahinter den Programm Name. Was passiert: ComSpec ist der Prozess cmd.exe (Die Konsole). Die hat eine eigene PID. Diese startet nun PLINK. Plink bekommt dadurch aber auch eine eigene PID. Wenn sich nun Plink neu startet (aus irgendeinem internen Grund) dann greift deine cmd.exe nicht mehr auf plink zurück.

    Mein Tipp: Ohne @ComSpec arbeiten sondern plink.exe direkt starten und dann jedes mal mit ProcessExists("plink.exe") die PID herrausfinden bevor du ein StdOut benutzt.

    Gruß,
    Spider