externes Programm ohne DosBox starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich schreibe mir gerade ein kleines Script, mit dem ich meinen Samba-Server per SSH tunneln kann. Dazu nutze ich ein extrenes Programm mit Namen 'plink.exe'. Das haut auch alles hin, bis auf einen kleinen Schönheitsfehler, das das DosBox Fenster von plink, immer offen ist, also in der Taskleiste. Meine Idee sieht so aus:

Code: Alles auswählen

os.spawnl(os.P_NOWAIT, 'plink.exe', '-ssh benutzer@htm-network.no-ip.org', '-pw passwort', '-L 127.0.0.5:139:192.168.2.110:139', '-N')
Ich starte das plink ja schon in einem eigenen Thread ( so wie ich im Internet gelesen hatte ). Ist es möglich, das komplette Fenster in den Hintergrund zu schieben?
Benutzeravatar
DrFaust
User
Beiträge: 21
Registriert: Freitag 15. Oktober 2010, 23:10

Mein Ansatzpunkt wäre jetzt eher die dosbox config gewesen, also das Python Skript. Gibt es da nicht irgendeine Möglichkeit? Da kann man doch alles mögliche konfigurieren...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sollte das nicht eher in das "Allgemeine Forum"?

wieso nutzt Du os.spawnl? Aus der Doku:
(Note that the subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using these functions. Check especially the Replacing Older Functions with the subprocess Module section.)
Also benutze lieber das subprocess-Modul.

Iirc hatten wir doch dazu schon mal ne Frage, bei der man bei subprocess Konsolen-Pop-Ups unterbinden konnte?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, ist gestern nen bischen spät gewesen. das Thema ist im "allegmeinen Forum", besser aufgehoben. Aber ne Lösung habe ich immer noch nicht gefunden. Allerdings wäre mir auch egal wenn ich einen solchen Tunnel, komplett in Python programmieren würde. Nur das mit dem plink.exe, war die einfachste Lösung erst mal und sie funktioniert.
Es gibt natürlich schon fertige SSH-Clients. Allerdings um Samba auf einem Windowsrechner zu tunneln, muß man noch ein:

Code: Alles auswählen

net stop server /y
voran schieben. Ich denke es wird wohl bessere Lösungen geben. Ich könnte mir ja auch mal das VirtualBasicScript anschauen. Nur da habe ich nicht so dolle Möglichkeiten, irgendwann mal ne wxGUI dabei zu legen.
Wäre nur schön gewesen wenn alles nen bischen im Hintergrund laufen würde, ohne DosBox denn für jeden neuen Port-Tunnel, würde eine DosBox aufgehen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

konnte es so auf die Schnell unter vbs lösen:

Code: Alles auswählen

Set WshShell = WScript.CreateObject("WScript.Shell") 

WshShell.Run "net stop server /y", 0 ,True
WshShell.Run "plink.exe -ssh benutzer@htm-network.no-ip.org -pw passwort -L 127.0.0.5:139:192.168.2.110:139, -N", 0, True
alles ohne Fenster im Hintergrund. Lieber wäre mir natürlich irgendwie Python.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hast Du es denn einmal mit subprocess versucht?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, hatte ich. Es öffnete sich dann ein neues Fenster, mit der Überschrift ./plink.exe und ging dann nicht mehr zu. Hatte es aber nur kurz angetestet, ohne zu schauen, ob es noch mehr Optionen für den subprocess gab.
Allerdings hätte ich unter Python eben viel mehr Möglichkeiten, wie zum Beispiel nen deamon schreiben, der nach Abbruch des Tunnels einen neuen aufbaut.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ich denke das geht schon irgendwie mit subprocess, ich meine dass es dazu irgendwo einen Thread in Froum gab. Finde den aber grad nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Genau :-) Das meinte ich (und Leonidas vermutlich auch)!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Das geht aber seit python 2.7 nicht mehr.
Ich mach es seitdem so:

Code: Alles auswählen

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, creationflags=0x08000000)
(Gilt aber nur für Windows, glaub ich.)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Mit 'creationflags=0x08000000' funktionieren aber die Console Handles nicht mehr (stdin, stout, stderr), vgl. hierzu die API-Doc:
...
The process is a console application that is being run without a console window. Therefore, the console handle for the application is not set.
...
Braucht man diese, gehts nur mit Console und verstecken dergleichen, oder man muss dem Kindprozess andere Deskriptoren/Handles unterschieben.

Funktioniert denn folgendes unter 2.7?

Code: Alles auswählen

import subprocess
from ctypes import *

class STARTUPINFOW(Structure):
    _fields_ = [
        ('cb', c_ulong),
        ('lpReserved', c_long),
        ('lpDesktop', c_long),
        ('lpTitle', c_long),
        ('dwX', c_ulong),
        ('dwY', c_ulong),
        ('dwXSize', c_ulong),
        ('dwYSize', c_ulong),
        ('dwXCountChars', c_ulong),
        ('dwYCountChars', c_ulong),
        ('dwFillAttribute', c_ulong),
        ('dwFlags', c_ulong),
        ('wShowWindow', c_ulong),
        ('cbReserved2', c_ushort),
        ('lpReserved2', POINTER(c_ubyte)),
        ('hStdInput', c_void_p),
        ('hStdOutput', c_void_p),
        ('hStdError', c_void_p)]

s = STARTUPINFOW()
s.dwFlags = c_ulong(1)
s.wShowWindow = c_ulong(5)  # hier 0 fuer SW_HIDE - Fenster verstecken
p = subprocess.Popen('cmd.exe', creationflags=0x10, startupinfo=s)
Da sollte ein normales DOS-Fenster mit MS-Shell starten.

Ich habe leider kein 2.7 installiert, kann mir aber beim besten Willen nicht vorstellen, dass das subprocess-Modul 'creationflags' und 'startupinfo' nicht mehr an 'CreateProcess()' durchreicht.
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

jerch hat geschrieben:Mit 'creationflags=0x08000000' funktionieren aber die Console Handles nicht mehr (stdin, stout, stderr), vgl. hierzu die API-Doc:
Also über die Funktionalität von stdin kann ich nicht sprechen, aber stdout und stderr nutze ich erfolgreich mit meinem oben angegebenen Schnipsel. :K

Aber ja, dein Schnipsel funktioniert unter Python 2.7
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Sieht so aus, als wäre das subprocess-Modul für Python 2.7 etwas aufgeräumt worden und dabei auch ist auch das

Code: Alles auswählen

from _subprocess import *
weggefallen. Ist eigentlich ein recht "hübsches" Beispiel dafür, warum Sternchen-Importe nicht so toll sind :)
In Python 2.7 kommt man auf einem kleinen Umweg trotzdem an die startupinfo-"Konstanten":

Code: Alles auswählen

import subprocess
from _subprocess import STARTF_USESHOWWINDOW, SW_HIDE

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= STARTF_USESHOWWINDOW
startupinfo.wShowWindow = SW_HIDE
subprocess.Popen('cmd.exe', startupinfo=startupinfo)
Antworten