![]() |
Einen Prozess starten und input und output stream verbinden auf z.b. Linux
In Lazarus gibt es TProcess.
Eine klasse die Prozesse starten kann und deren Input- und Outputstream abfangen kann. Das geht auf windows und in POSIX systemen. Kann man sowas mit einer solche Klasse oder auf anderem Wege auch in Delphi machen? Vor allem für Posix oder Linux/Android systeme? |
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
|
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Das könnte es sein!
|
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Also ich havbe die unit PascalProcess mal ausprobiert... mehrere tage.
Es scheint gut für manche dinge zu funktionioeren aber andere wiederum nicht so .
Delphi-Quellcode:
Ich glaube dass wenn ich /system/bin/su erzeuge, die Pipes für in/out/err nicht wirklich mit dem Process verbunden sind aber dennoch existieren...deswegen bekomme ich keine Fehlermeldung winn ich in die "in" pipe schreibe und keine error Meldung wenn ich die outpipe auslese...
procedure ProcessTest;
Begin var output:TBytes; //Funktioniert output := TPProcess.Execute('/system/bin/ls -l ttyS9', '/dev' );//output = '--x---x---x ttyS9 hasse nicht gesehen' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); //Funktioniert anscheinend irgendwie nicht alle '*' eingaben kann ls nicht über TPProcess output := TPProcess.Execute('/system/bin/ls -l tty*', '/dev' );//output = 'no such file tty*' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); //Ich weiß nicht ob es funktioniert, aber kein output und auch kein effekt, aber auch keine Fehlermeldung output := TPProcess.Execute('/system/bin/su root /system/bin/ls -l ttyS9', '/dev' );//output = '' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); output := TPProcess.Execute('/system/bin/su root /system/bin/chmod 777 /dev/ttyS9', '/dev' );//output = '' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); end; ich habe das versucht mit nem interaktiven process.
Delphi-Quellcode:
Kein Ergebnis kein output und aber auch keine Fehler
Procedure SetFileRights(const fileRights:String);
Begin var report:string; try var Attributes := TFile.GetAttributes('/dev/ttyS9'); report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak; var Process:IPProcess := (TPProcess.Create( '/system/bin/su', '/dev' ) as IPProcess); report := report + 'Process Created'+slineBreak; Process.MergeError := true; Process.Execute; report := report + 'Process started'+slineBreak; Sleep(150); var chmod_Command := 'chmod '+fileRights+' /dev/ttyS9'+linefeed; report := report + 'chmod_Command composed: '+chmod_Command+slineBreak; var cmd:TBytes := Tencoding.UTF8.GetBytes(UTF8Encode(chmod_command)); Process.WriteProcessInput(cmd); report := report + 'chmod_Command written '+slineBreak; Sleep(150); report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak; var exit_Command := 'exit'+linefeed; report := report + 'exit_Command composed: '+exit_Command+slineBreak; cmd := Tencoding.UTF8.GetBytes(UTF8Encode(exit_Command)); Process.WriteProcessInput(cmd); report := report + 'exit_Command written '+slineBreak; Sleep(150); Process.Waitfor; report := report + 'Process Ended' + slineBreak; report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak; Attributes := TFile.GetAttributes('/dev/ttyS9'); report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak; except on E:Exception do Begin report := report +'Exception: '+ e.Message+slinebreak; end; end; sleep(200); TDialogService.ShowMessage( Report); end; Mache ich irgend etwas falsch? |
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Ich habe das Ding nie benutzt. Für mich ist das ähnlich wie Kommunikation über serielle Schnittstellen- Alle 6 Monate erfindet jemand eine neue "one size fits all"-Library, aber im Endeffekt verwendet das doch jeder völlig anders. Sowas mache ich lieber maßgeschneidert von Hand.
Auf der anderen Seite ist der gute pyscripter eigentlich einer der besten Pascal-Leute hier auf diesem Planeten. Schreib den doch mal über die englische Delphi-Praxis an, der kann sicher helfen. |
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Ich versuche jetzt mal das ganze mit "sh"
weil in den beispielen hat er alles mit "cmd" gemacht vielleicht braucht es "sh" um sicher die in/ou/err pipelines zu verbinden danach frage ich mal in der Internationalen Delphipraxis. |
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
OMG...
vielleicht kann ich die unit doch benutzen
Delphi-Quellcode:
var output:TBytes;
// das geht ja nicht output := TPProcess.Execute('/system/bin/su root /system/bin/ls -l ttyS9', '/dev' );//output = '' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); // ABER DAS GEHT output := TPProcess.Execute('/system/bin/sh -c "su root /system/bin/ls -l ttyS9"', '/dev' );//output = 'rwx-rwx---x ttyS9 hasse nicht gesehen' TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output)); |
AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Also ok
Alles geht! mann muss einfach immer den prozess /system/bin/sh -c "Meine befehle und prozesse und parameter" starten. Und -s noch dran hängen für interaktive Sitzungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz