Linux, su mit Passwortübergabe
Linux, su mit Passwortübergabe
Hi,
Ich benötige den Auruf einer Shell mit su Rechten und Passwort Übergabe. SUDO ist keine Option!
Leider scheint das keineswegs trivial und ich bin mit Ansätzen aus dem Netz bisher gescheitert.
Kann mir dabei jemand weiterhelfen?
Also etwas in dieser Art, wobei ich weiß das su in einer Shell laufen muss und diese spawnt...
echo <password> | su -c whoami
Obiges funktioniert natürlich nicht bei Aufruf von runcommand und soll nur die Aufgabe darstellen...
Schonmal Danke fürs Lesen...
Ich benötige den Auruf einer Shell mit su Rechten und Passwort Übergabe. SUDO ist keine Option!
Leider scheint das keineswegs trivial und ich bin mit Ansätzen aus dem Netz bisher gescheitert.
Kann mir dabei jemand weiterhelfen?
Also etwas in dieser Art, wobei ich weiß das su in einer Shell laufen muss und diese spawnt...
echo <password> | su -c whoami
Obiges funktioniert natürlich nicht bei Aufruf von runcommand und soll nur die Aufgabe darstellen...
Schonmal Danke fürs Lesen...
Gruß, Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6782
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Linux, su mit Passwortübergabe
Krücke, die ich kenne, mit runncommand ein Scriptaufrufen, das eine (volle) Bash mit dem Script aufruft, was die höhere Rechte vergibt.six1 hat geschrieben: Fr 25. Okt 2024, 09:30 Obiges funktioniert natürlich nicht bei Aufruf von runcommand und soll nur die Aufgabe darstellen...
Ev. kann man was mit den Capabilities zusätzlich hintricksen.
#!/bin/bash
PASSWD="ToPsEcReT"
echo -e $PASSWD | sudo -S setcap CAP_NET_RAW,CAP_SYS_TIME,CAP_NET_BROADCAST,CAP_NET_BIND_SERVICE,CAP_FOWNER,CAP_IPC_OWNER,CAP_SYS_RAWIO=+ep /home/xx/data/prg
/home/xx/data/prg
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Linux, su mit Passwortübergabe
Hi af0815,
Mein sudo ist wegen sudoers Eintrag nicht berechtigt die von mir benötigte Aktion auszuführen. Es muss also su sein! Ich habe natürlich su Rechte und zugehörigem Passwort! ...also nichts böses im Sinn
Nur meine Software muss bei Bedarf etwas mit su Rechten im Hintergrund erledigen...
Aber schon mal Danke für deinen Lösungsvorschlag
Mein sudo ist wegen sudoers Eintrag nicht berechtigt die von mir benötigte Aktion auszuführen. Es muss also su sein! Ich habe natürlich su Rechte und zugehörigem Passwort! ...also nichts böses im Sinn

Nur meine Software muss bei Bedarf etwas mit su Rechten im Hintergrund erledigen...
Aber schon mal Danke für deinen Lösungsvorschlag
Gruß, Michael
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Linux, su mit Passwortübergabe
Su ist dafür einfach nicht gemacht. Es gibt zwar workarounds wie den script commands, aber wirklich schön ist was anderes.
Das gesagt, du kannst natürlich auch einfach dein eigenes sudo artige Programm für deinen Aufruf bauen. Am Ende ist su und sudo auch nur ein ganz normales Programm bei dem das stuid Bit gesetzt ist
Das gesagt, du kannst natürlich auch einfach dein eigenes sudo artige Programm für deinen Aufruf bauen. Am Ende ist su und sudo auch nur ein ganz normales Programm bei dem das stuid Bit gesetzt ist
- af0815
- Lazarusforum e. V.
- Beiträge: 6782
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Linux, su mit Passwortübergabe
Mein eigentlicher Punkt war - rufe eine volle Bash mit runncomand auf. Dort geht dann dein Script.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- Zvoni
- Beiträge: 376
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Linux, su mit Passwortübergabe
Was ist mit polkit?
https://www.freedesktop.org/software/po ... xec.1.html
oder Zenity?
https://en.wikipedia.org/wiki/Zenity
https://www.freedesktop.org/software/po ... xec.1.html
oder Zenity?
https://en.wikipedia.org/wiki/Zenity
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: Linux, su mit Passwortübergabe
@af0815 -> jjjjaaaa... script aus Programm usw... ich zögere noch
@zvoni -> dafür müsste ich noch externe Programme nachinstallieren.... wofür ich su brauche?
Aber im Moment habe ich es, so glaube ich im Moment!, am Laufen!
gibt root aus!!!

@zvoni -> dafür müsste ich noch externe Programme nachinstallieren.... wofür ich su brauche?

Aber im Moment habe ich es, so glaube ich im Moment!, am Laufen!
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
outputstr:string;
begin
Memo1.Clear;
Runcommand('/bin/sh',['-c','echo ''<MyPassword>'' | sudo -S -u root whoami'],outputstr,[postderrtooutput]);
Memo1.lines.add(outputstr);
end;
Gruß, Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6782
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Linux, su mit Passwortübergabe
Dein Button1 macht genau das was ich gemeint habe.
Sieht ja recht einfach aus, wenn man die Lösung hat.

Sieht ja recht einfach aus, wenn man die Lösung hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Linux, su mit Passwortübergabe
...ich bin noch am Testen... noch ist die Schlacht nicht gewonnen 
Es ist immer das Eine, was mein Entwicklungssystem macht, aber etwas ganz anderes, was ein Produktivclient macht

Es ist immer das Eine, was mein Entwicklungssystem macht, aber etwas ganz anderes, was ein Produktivclient macht

Gruß, Michael
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Linux, su mit Passwortübergabe
Mit sudo vernünftig über STDIN zu interagieren ist tatsächlich gar nicht mal so einfach. Beginnen wir mal mit deinem Beispiel:
Woher bekommst du MyPassword? Wenns aus einer Nutzereingabe ist, dann kann ich einfach
eintippen und hab den Nutzerordner geschrottet. Du solltest versuchen immer zu vermeiden die Shell (oder irgendenen anderen voll funktionsfähigen Interpreter) mit Nutzerinput aufzurufen. Selbst wenn du den Input gegen ' checkst, darf ich an die Shellshock vulnerability erinnern bei der eine bestimmte Kombination aus zeichen bash so verwirrt hat das man beliebigen code ausführen konnte.
Selbst wenn du das Problem löst, hast du immernoch das Problem mit Robustem Fehlerhandling. Nimm das folgende Beispiel:
false als kommand failed immer (exit code <> 0). Woher kann das Programm also wissen ob das Passwort falsch war oder einfach der command gefailed hat? Man muss den output parsen. Der Output von sudo ist in dem Fall:
Das ist Fließtext und noch schlimmer, Übersetzter Fließtext. Den stabil zu erkennen kann ein echtes Problem werden.
Normalerweise ist daher die Lösung einfach das Sudo Askpass zu benutzen. Daher die Frage was genau willst du erreichen?
Wenn du nur willst das der Nutzer sein Passwort im GUI eintippt, kannst du einfach ein simples Lazarus Programm bauen was eine Form startet mit einem Feld für das Passwort, und dieses dann über den -A Parameter dem sudo command zu übergeben.
Wenn das Passwort unbedingt von deinem Programm übergeben werden soll, z.B. weil dein Programm das Passwort für mehrere Befehle cached oder (Gott bewahre) speichert, dann wirds zwar auch kompliziert, aber ist trozdem machbar, du kannst einfach ein automatisiertes Askpass programm bereitstellen das z.B. über eine FIFO das passwort aus deinem Programm lädt.
Alles in allem ist das eher der Weg den du gehen solltest statt zu versuchen Multilinguale Konsolenausgaben zu parsen. Denn genau dafür gibt es den -A parameter
Code: Alles auswählen
Runcommand('/bin/sh',['-c','echo ''<MyPassword>'' | sudo -S -u root whoami'],outputstr,[postderrtooutput]);
Code: Alles auswählen
'; rm -rf ~
Selbst wenn du das Problem löst, hast du immernoch das Problem mit Robustem Fehlerhandling. Nimm das folgende Beispiel:
Code: Alles auswählen
echo foo | sudo -S false
Code: Alles auswählen
<pwd>Das hat nicht funktioniert, bitte nochmal probieren.
<pwd>
sudo: Es wurde kein Passwort angegeben
sudo: 1 Fehlversuch bei der Passwort-Eingabe
Normalerweise ist daher die Lösung einfach das Sudo Askpass zu benutzen. Daher die Frage was genau willst du erreichen?
Wenn du nur willst das der Nutzer sein Passwort im GUI eintippt, kannst du einfach ein simples Lazarus Programm bauen was eine Form startet mit einem Feld für das Passwort, und dieses dann über den -A Parameter dem sudo command zu übergeben.
Wenn das Passwort unbedingt von deinem Programm übergeben werden soll, z.B. weil dein Programm das Passwort für mehrere Befehle cached oder (Gott bewahre) speichert, dann wirds zwar auch kompliziert, aber ist trozdem machbar, du kannst einfach ein automatisiertes Askpass programm bereitstellen das z.B. über eine FIFO das passwort aus deinem Programm lädt.
Alles in allem ist das eher der Weg den du gehen solltest statt zu versuchen Multilinguale Konsolenausgaben zu parsen. Denn genau dafür gibt es den -A parameter
Re: Linux, su mit Passwortübergabe
Danke für die ausführliche Erklärung Warf!
Es ist relativ simpel:
Die Software beinhaltet das Passwort, kann also selbstständig die nötigen Änderungen durchführen.
Es ist also keine Usereingabe notwendig!
Ich habe mich auch zu früh gefreut... auf meinem Entwicklungssystem sind leider abweichende Einstellungen der sudoers und auch ander User.
Mein Beispiel:
Runcommand('/bin/sh',['-c','echo ''<MyPassword>'' | sudo -S -u root whoami'],outputstr,[postderrtooutput]);
verlangt die Eingabe des Passwort des angemeldeten User und NICHT das Passwort für su
Ich benötige aber die Ausführung eines Kommandos unter su mit übergebenem Passwort.... das trifft es wohl
Es ist relativ simpel:
Die Software beinhaltet das Passwort, kann also selbstständig die nötigen Änderungen durchführen.
Es ist also keine Usereingabe notwendig!
Ich habe mich auch zu früh gefreut... auf meinem Entwicklungssystem sind leider abweichende Einstellungen der sudoers und auch ander User.
Mein Beispiel:
Runcommand('/bin/sh',['-c','echo ''<MyPassword>'' | sudo -S -u root whoami'],outputstr,[postderrtooutput]);
verlangt die Eingabe des Passwort des angemeldeten User und NICHT das Passwort für su
Ich benötige aber die Ausführung eines Kommandos unter su mit übergebenem Passwort.... das trifft es wohl
Gruß, Michael
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Linux, su mit Passwortübergabe
Was du tun kannst, und ACHTUNG GEFÄHRLICH!!!! aber Grundsätzlich möglich.
Teil deine Anwendung auf in die Hauptanwendung und dann die sachen die als Root ausgeführt werden sollen.
Die anwendung die als root ausgeführt werden soll, setzt du als owner root und setzt das set-uid flag:
Jetzt wird deine app "myapp" immer als root ausgeführt, egal wer sie aufruft. So funktionieren übrigens auch sudo und su.
Dann ruft deine Hauptanwendung deine root anwendung ("myapp" im beispiel oben) einfach via runcommand auf, und deine root anwendung kann dann machen was notwendig ist als root.
Das bedeutet du brauchst nur bei der installation einmal root rechte umd das setuid bit für root zu setzen, und danach brauchst du weder passwort noch su
Teil deine Anwendung auf in die Hauptanwendung und dann die sachen die als Root ausgeführt werden sollen.
Die anwendung die als root ausgeführt werden soll, setzt du als owner root und setzt das set-uid flag:
Code: Alles auswählen
# Als root ausführen
chown root:root myapp
chmod u+s myapp
Dann ruft deine Hauptanwendung deine root anwendung ("myapp" im beispiel oben) einfach via runcommand auf, und deine root anwendung kann dann machen was notwendig ist als root.
Das bedeutet du brauchst nur bei der installation einmal root rechte umd das setuid bit für root zu setzen, und danach brauchst du weder passwort noch su
Re: Linux, su mit Passwortübergabe
Hallo Warf,
ich habe das mal umgesetzt.
Die neue App, welche Änderungen vornehmen soll heißt "helper".
Hier die Berechtigungen der App: Im Programm wird ausgeführt:
Nennen wir den normalen User am Zielsystem mal UserA.
UserA startet die App. Die Ausgabe ist: UserA
Hier hätte ich jetzt root erwartet, oder? Was habe ich noch nicht verstanden?
Die Rechte werden nicht delegiert
Hier der Code der App "helper"
ich habe das mal umgesetzt.
Die neue App, welche Änderungen vornehmen soll heißt "helper".
Hier die Berechtigungen der App: Im Programm wird ausgeführt:
Code: Alles auswählen
Runcommand('/bin/sh',['-c','whoami'],outputstr,[postderrtooutput]);
writeln( outputstr);
UserA startet die App. Die Ausgabe ist: UserA
Hier hätte ich jetzt root erwartet, oder? Was habe ich noch nicht verstanden?
Die Rechte werden nicht delegiert

Hier der Code der App "helper"
Code: Alles auswählen
program helper;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes, SysUtils, CustApp, Process
{ you can add units after this };
type
{ cpHelper }
cpHelper = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ cpHelper }
procedure cpHelper.DoRun;
var
ErrorMsg, outputstr: String;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h', 'help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h', 'help') then begin
WriteHelp;
Terminate;
Exit;
end;
Runcommand('/bin/sh',['-c','whoami'],outputstr,[postderrtooutput]);
writeln( outputstr);
// stop program loop
Terminate;
end;
constructor cpHelper.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor cpHelper.Destroy;
begin
inherited Destroy;
end;
procedure cpHelper.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ', ExeName, ' -h');
end;
var
Application: cpHelper;
begin
Application:=cpHelper.Create(nil);
Application.Title:='cpHelper';
Application.Run;
Application.Free;
end.
Gruß, Michael
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Linux, su mit Passwortübergabe
Was sagt denn ls -l? Wenn du das chmod u+s gemacht hast sollte da in den Zugriffsberechtigungen ein "s" stehen (so wie auch bei sudo executable)