Nutzerrechte [gelöst]

Alles rund um die Programmierung mit Qt
Antworten
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Nutzerrechte [gelöst]

Beitrag von Label »

Einen guten Tag alle miteinander!

Ich habe folgendes Problem:
Ich möchte/muss ein Programm schreiben, welches sich nur mit Administrationsrechten starten lässt (in Ubuntu).
Gibt es in dieser Richtung (Accounterkennung oder so) schon irgendwas womit ich das in Qt umsetzen kann?
Und wenn nicht, dann entschuldige ich mich hiermit dafür, dass es nicht hier hingehört, aber ... könnte mir trotzdem jemand einen Tipp geben wie ich das ohne Qt bewerkstelligen kann? Ich hab im Augenblick absolut keine Idee und weiss gar nicht wo ich überhaupt ansetzen muss ....

Bin für jeden Ratschlag dankbar.

MfG Label
Zuletzt geändert von Label am 12. März 2009 15:18, insgesamt 1-mal geändert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Wiess ned ob die QT da was kann, aber ich vermute eher nicht ....

Linux ist Posix kompatibel, d.h. es bietet ne bestimmte API zum BS.
Die UserID, also unter welchem user der Prozess grad laeuft (der prozess kann seinen user auch wechseln) kann man da mit uid_t getuid (void); (braucht <sys/types.h>, <unistd.h>) abfragen.
Den Realen usernamen ("root") wirst ned abfragen brauchen aus der ID, da root eigentlich immer die ID = 0 haben sollte ....

Aber ich hoffe du weisst was du tust ...
eigentlich sollte man sowas nur fuers gegenteil verwenden, zu warnen, wenn irgendwas als root ausgefuehrt wird.

Nen programm auf root festnageln macht gewisse sachen unflexibel.
Besser ists zu checken, ob alle notwendigen Operationen auch ausgefuehrt werden koennen, unabhaengig vom verwendeten user.
Meist kann man rechte auch dateien (ob vorhanden(sichtbar), lesbar, ausfuehrbar) abfragen (in unix ist eh fast alles file basiert) ....

Ciao ...
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Danke für die schnelle Antwort!
Ich hab das mal ausprobiert und es hat wunderbar funktioniert.
Daumen hoch

Label
bigb702
Beiträge: 11
Registriert: 4. März 2009 13:00

Beitrag von bigb702 »

@Label

Ich habe auch grade das Problem so wie das aussieht, zumindet denke ich das, da das Programm in QProcess Befehle ausführen sollen, die nur als Root laufen können.
Kannst du mal bitte deine Lösung posten?



Gibt es nicht ne Möglichkeit das Programm nach dem Passwort zu fragen wie wenn ich Synaptic aufrufe?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Gibt es nicht ne Möglichkeit das Programm nach dem Passwort zu fragen wie wenn ich Synaptic aufrufe?
da wurde man doch auf die idee kommen, das Program was in QProgress laufen soll, ned direkt auszufuhren sondern in nem Shell script mit einem "su root pwd" vorneweg. Alternativ kannst du auch Qprocess auf su aufrufen und dein auszufuehrendes Program als Parameter mit -c uebergeben. glaub mit kdesu und gtksu geht das auch ...
Ansonsten password abfrage im stdout abfangen und setzen ^^

Iss aber sehr anfaellig und aeusserst kritisch.

du kannst deinem Programm selber bei der installation mit dem Eigner "root" das SetUID Flag mitgeben. Das heisst dein Programm kann, wenn von anderen usern aufgerufen, intern dann mit seteuid(0) auf den effektiven user auf root wechseln (ohne passwort abfrage).
Das ist aber auch kritisch, nur wirklich notwendige systemprogramme sollten das "suicid" :twisted: Flag haben !

Ciao ...
bigb702
Beiträge: 11
Registriert: 4. März 2009 13:00

Beitrag von bigb702 »

Nope! Habe ich auch versucht, klappt aber nicht. Ich kriege dann diese Meldung:

Qt: Session management error: Authentication Rejected, reason : None of the authentication protocols specified are supported and host-based authentication failed

Im QFileDialog startet er zwar mit dem Ordner des Root, aber das Programm scheint ohne Rootrechte zu laufen. Wenns klappen sollte, soltle mir z.B.: fdisk Meldungen im Programm ausgeben wie es Programme machen, die ich als Non-Root starten kann.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Was hasst du den fuer system ?
fdisk krieg ich definitiv nicht als user zu laufen, nichtmal nen schnoedes fdisk -l
eingehangene partitionen usw kriegst natuerlich raus, aber ned ueber fdisk, sondern ueber systeminformationen bzw die virtuellen filesysteme ....

wenn da tiefergreifende dinge tun willst, wuerd ich dir auch weiterfuehrende Linux / Posix Literatur ans Herz legen.

Ciao ...
bigb702
Beiträge: 11
Registriert: 4. März 2009 13:00

Beitrag von bigb702 »

Debian Lenny nutze ich. Es geht ja nicht um fdisk, war nur ein Beispiel. Jedenfalls muß das Programm mit Root Rechten laufen. Ist es nicht möglich wenn ich zb: n Befehl mit sudo ausführen will, das Passwort in den Promt hinterherzuschicken?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ja kannst du, und iss auch so ohne weiteres deine momentane chance, so mega unschoen das auch ist ^^

Schu dir die manpages zu su und zu sudo an.

du kannst ja mit QProcess das stdin abfangen, bzw dein QProcess ist ja ein OIDevice was dir das stdout durchreicht. Dort auf das "Passwort:" parsen und passwort inklusive enter ins stdin des prozesses setzen dem du in das QProcess - Device schreibst.

1. wenn es dir nur um die "grafische" abfrage geht, dann verwende kdesu und gtksu (oder so aehlich) die fragen nicht auf der konsole (stdin/stdout) sondern in ner grafischen eingabebox ab. Ansonsten äquivalent zu su ....

2. der richtige weg waere, dein Programm wenn es so systemfunktionen und informationen braucht, auch mit dem richtig berechtigten user(root) laufen zu lassen ....

Was ist der unterschied ob ein Programm vom user aus schon mit -sudo/su vorher gestartet werden muss oder der user beim arbeiten mit dem programm zur eingabe des userpasswortes aufgefordert wird ???

Ciao ...
bigb702
Beiträge: 11
Registriert: 4. März 2009 13:00

Beitrag von bigb702 »

Das ist ja das Problem. werder su noch gksu laufen. Bei sudo kreige ich zumindest nicht diese Fehlermeldung. Hier mir lasse ich mir die Meldungen zurückgeben:

QByteArray output;
while(proc.waitForReadyRead())
output += proc.readAll();
QStringList entries= QString::fromLocal8Bit(output).split('\n');
entries.removeLast();
foreach(QString entry, entries) {
new QListWidgetItem(entry, listWidgetStatus);
}

Sachen wie df zeigen auch was an. Root-Sachen wie fdisk nichts. Daher bin ich draufgekommen, daß die Befehle nicht ausgeführt werden. Nur verstehe ich noch nicht wieso Meldungen wie command not found nicht kommen.
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

@ bigb702: Ich habe es genau so gelöst, wie es RHBaum vorgeschlagen hat:
1. ich habe <sys/types.h> und <unistd.h> eingebunden,
2. ich habe vor dem "return a.exec()" mit der Funktion getuid() die userID abgefragt, mit der das Programm gestartet wurde,
3. if (userID != 0) Fehlermeldung und return
else return a.exec()
bigb702
Beiträge: 11
Registriert: 4. März 2009 13:00

Beitrag von bigb702 »

Irgendie bin ich grade zu blöd dafür. Poste doch bitte mal deinen Code. Kriege das nicht hin auch nicht mit anderen Beispielen.

thx

Update: Ok. Mein Problem war nur, daß ich mit absoluten Pfaden arbeiten muß. einfach nur fdisk geht nicht, da die Shell daß nur findet, weil sie mit Suchpfaden arbeitet. Im Programm muß ich aber /sbin/fdisl angeben. Und ich muß es hinkreigen, daß mir auch exit code angegeben werden. wen *.start(...); nicht funktioniert.

Update2:

Gibt es ne Möglichkeit von Qprocess zurückzubekommen, was start nun wirklich ausgeführt hat? AUch wenn exit code 0 = alles ok beduetet, will ich es trotzdem genauer wissen.

Update:

Langsam reichts mir. fdiisk usw gehen. rufe ich Partimage auf, wird die Imagefile angelegt. Aber nur wenn ich das alles in einem Befehl habe.Allerdings müssen die Infoermationen aber eingegeben und ausgelesen werden. Ich lese die Felder aus und bau mir den String wie ich ihn brauche:

QStringList args;
QString save = lineEditSave->text();
QString source = "/dev/";
QString src = lineEditSource->text();
source += src;
source += " ";
source += save;

Ich habe source auch noch in ne lineEdit geschreiben. Alles wie ich will. Nur wenn ich mit ("...", args) den String dranhänge, den ich vorher mit args << source; angehängt habe, klappt es nicht.
Antworten