Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.056 Beiträge
 
Delphi 12 Athens
 
#4

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux

  Alt Heute, 12:38
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:
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 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...
ich habe das versucht mit nem interaktiven process.

Delphi-Quellcode:
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;
Kein Ergebnis kein output und aber auch keine Fehler

Mache ich irgend etwas falsch?
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat