Programm ausführen das root benötigt

Antworten
DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Programm ausführen das root benötigt

Beitrag von DL3AD »

Hallo,
ich möchte innerhalb eines Programmes ein anderes starten das aber root rechte benötigt.
Folgendes funktioniert wenn ich root bin

Code: Alles auswählen

  AProcess.Executable:= 'usbip';
  AProcess.Parameters.Add('list');
  AProcess.Parameters.Add('-r');
  AProcess.Parameters.Add('192.168.2.224');
  Aprocess.Execute;

Wie kann ich diesen Aufruf gestalten wenn ich nur als normaler User agiere ?
Kann mann da SUDO mit PW übergeben ?

Gruß Frank

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2303
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Programm ausführen das root benötigt

Beitrag von m.fuchs »

Wäre für deinen Fall nicht SUID die bessere Wahl?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1491
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Programm ausführen das root benötigt

Beitrag von Warf »

m.fuchs hat geschrieben:Wäre für deinen Fall nicht SUID die bessere Wahl?


Damit würde ich mal ganz vorsichtig sein, denn dieses flag als root zu setzen bedeutet das jeder user diese datei als root ausführen kann, ohne irgendwelche sicherheitschecks

DL3AD hat geschrieben:Kann mann da SUDO mit PW übergeben ?

Gruß Frank


Ja, schau mal in die sudo map page

Du kannst entweder über den -A parameter eine eigene askpass executable angeben, die dann das passwort auf stdout printed. Das könntest du dann so machen:
1. du erstellst eine temporäre fifo, 2. du erstellst ein temporäres script das diesen fifo mit cat ausliest, 3. du startest sudo mit -A path/to/script und schreibst das passwort in die fifo.
Die andere option ist du benutzt den -S parameter:
The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device. The password must be followed by a newline character.

Damit kannst du einfach beim TProcess mit poUsePipes das passwort über den STDIN stream übergeben

DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm ausführen das root benötigt

Beitrag von DL3AD »

... ja - nun funktioniert es mit sudo und -S

DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm ausführen das root benötigt

Beitrag von DL3AD »

in der console habe ich folgendes getestet und dass funktioniert auch

Code: Alles auswählen

echo mypasswd | sudo -S usbip list -r 192.168.2.224


es wird ordnungsgemäß aufgelistet.

Wie kann ich diese CMD Zeile mit runcommand oder wie im ersten Pos laufen lassen ?
Ich benötige auf jeden fall die Ausgabe der Console - runcommand gibt die Ausgabe ja zurück.

Gruß Frank

DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm ausführen das root benötigt

Beitrag von DL3AD »

Hallo,
habe mal folgendes versucht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TProcess;
  StrList : TStringlist;
begin
  AProcess:= TProcess.Create(nil);
  StrList:= TStringList.Create;
  AProcess.Options:= [poNoConsole, poWaitOnExit, poUsePipes];
  AProcess.CommandLine:= 'echo mypasswd | sudo -S usbip list -r 192.168.2.224';
  Aprocess.Execute;
  StrList.LoadFromStream(Aprocess.Output);
  Memo1.Append(StrList.Text);
  StrList.Free;
  AProcess.Free;
end;         


Dass zeigt mit im Memo aber nicht die Ausgabe von usbip an sondern nur "mypasswd | sudo -S usbip list -r 192.168.2.224"
Wie komme ich da weiter ?

Gruß Frank

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 664
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Programm ausführen das root benötigt

Beitrag von fliegermichl »

Das wird so nicht funktionieren.
echo ist ein Befehl und sudo ein zweiter.

Die Pipe besagt, Frau echo gib bitte MyPasswd in der Ausgabe aus und befördere dies an Herrn sudo's Eingabe.
Das wird durch die Bash erledigt.

In deinem Beispiel bekommt echo die gesamte Zeichenkette und gibt diese aus.

Es sollte funktionieren wenn du nur 'sudo -S usbip list -r 192.168.2.224' in die CommandLine schreibst und das Passwort in AProcess.Input schreibst.

DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm ausführen das root benötigt

Beitrag von DL3AD »

Danke für denTipp.
Habe nun folgendes versucht

Code: Alles auswählen

AProcess.Input.WriteAnsiString('mypasswd'); 

Er kompiliert sauber aber bricht mit Exception-Klasse >>External:SIGSEGV<< ab :shock:

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 664
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Programm ausführen das root benötigt

Beitrag von fliegermichl »

AProcess.Input ist nil. Es muss vorher CreatePipeStreams aufgerufen werden.
Siehe https://www.freepascal.org/docs-html/fc ... ocess.html

DL3AD
Beiträge: 435
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm ausführen das root benötigt

Beitrag von DL3AD »

...wie sieht das aus ? bei Aprocess.Input. kommt kein CreatePipeStreams :oops:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4285
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Programm ausführen das root benötigt

Beitrag von af0815 »

Ist immer wieder in Diskussion angesprochen worden. TProzess ist keine Shell !! Also ein Befehl und keine Pipes zwischen Befehlen. Ich glaube nicht das sich da was geändert hat. Was geht ist, das man eine Shell aufruft und der die Befehle übergibt, dann kann das funktionieren.

Siehe https://wiki.freepascal.org/Executing_E ... rograms/de

Code: Alles auswählen

Anmerkung: TProcess ist kein Terminal bzw. keine Shell! Weder können Skripte direkt ausgeführt werden, noch kann die Ausgabe mit Operatoren wie "|", ">", "<", "&" etc. umgeleitet werden. Es ist möglich, die gleichen Ergebnisse mit TProcess und FreePascal zu erzielen. Ein paar Beispiele finden Sie weiter unten.
 


BTW: In der englischen Seite gibt es mehr Info https://wiki.freepascal.org/Executing_E ... h_TProcess
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten