Hallo,
Volker Englisch <
v.englis...@rsli.de> wrote:
> Am 25.11.12 schrieb Juergen Ilse:
>> Gerhard Strangar <
g...@arcor.de> wrote:
>>> Volker Englisch wrote (2012-11-24 18:33):
>>>> Dazu habe ich eine extra Gruppe angelegt und einen Wrapper geschrieben
>>>> (und kompiliert...), der nichts anderes macht, als lpc mit den
>>>> übergebenen Parametern aufzurufen (mit explizitem Pfad zu lpc).
>>> [...]
>>>> Oder fällt jemandem hier ein besserer Weg ein, das Problem zu lösen?
>> Versuch mal, vor dem exec() ein setuid(geteuid()); moeglicherweise
>> loest das dein Problem ...
> Hmm, wenn meine Kenntnisse in C nicht so äußerst rudimentär wären - ich
> hatte den Wrapper in einer anderen (uralten) Sprache geschrieben.
Kannst du in der Sprache Library-Funktionen aufrufen? Wenn ja, rufe
die Funktion geteuid() auf (die gibt die effektive UID, also bei root
als Eigentuemer der Datei und gesetztem SetUID-Bit 0) zurueck. Dann
must du die Funktion setuid() aufrufen mit dem Wert, den du von geteuid()
zurueckbekommen hast, als Parameter. Wenn ich da nicht etwas falsch in
Erinnerung habe, gehen die mittels SetUID-Bit erhaltenen root-Rechte
beim starten eines anderen Programms wieder verloren, wenn man nicht
vorher auch die real UserID auf den Wert gesetzt hat. Der Aufruf von
setuid() dient nur dazu, die real-UserID zu setzen, bevor man ein
anderes Programm aufruft.
> Ein Versuch in C mit (erstmal) nur Aufruf von lpc scheitert bereits
> daran, daß lpc scheinbar einen falschen Parameter bekommt (?Bad
> command):
>
> #include <stdio.h>
> #include <unistd.h>
>
> int main (void)
> {
> int rc;
> rc = execl("/usr/sbin/lpc", "lpc", "stop 4", NULL);
Das entpraeche in etwa einem
/usr/sbin/lpc "stop 4"
(beachte die Anfuehrungszeichen). Wenn du *eigentlich* das Kommando
/usr/sbin/lpc stop 4
ausfuehren moechtest, solltest du statt dessen etwas wie
rc = execl("/usr/sbin/lpc", "lpc", "stop", "4", NULL);
durchfuehren. Du koenntest es dir aber auch einfach macgen und die
shell deine Kommandoteile parsen lassen, indem du die auszufuehrende
Kommandozeile als einen einzigen String an die Funktion system()
uebergibst ...
> return rc;
> }
>
> Wie gesagt, C ist nicht meine Welt, sorry...
Evt.kannst du etwas entsprechendes wie das setuid(geteuid()); auch
in der von dir verwendeten Sprache nachbauen ...
Tschuess,
Juergen Ilse (
jue...@usenet-verwaltung.de)