2010-12-29 7 views
3

Dies könnte eine einfache Frage sein, aber wie kann ich System/Root-Privilegien vom Benutzer in einer c-Konsole-Anwendung "anfordern". Ich muss an/Private/etc schreiben, aber ich kann nicht. Dies ist für Mac/Unix.Access/Private/etc mit c

Ich habe gesehen, dass es in anderen Konsolenbefehlen verwendet wird, z. Wenn Sie den folgenden Befehl ausführen: "sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder", fragt Terminal nach Ihrem Kennwort. Wie mache ich das?

Dank, JNK

+0

Ich habe die Lösung gefunden, indem ich einfach den Befehl "sudo/path/to/my/c/file" ausgeführt habe ... – JNK

Antwort

5

Es gibt keinen Systemaufruf, bei dem ein Prozess Root-Berechtigungen erhalten kann. Sie könnten erwarten, dass seteuid auf diese Weise funktioniert, aber es kann nur von Prozessen mit Root-Prozessen verwendet werden (unprivilegierte Prozesse können nur die euid gleich der uid setzen).

sudo ist speziell, weil seine ausführbare Datei setuid Berechtigungen hat. Dies bedeutet, dass wenn ausgeführt wird, es als der Benutzer ausgeführt wird, der es besitzt (root), anstatt den Benutzer, der es ausführt. sudo kann überprüfen, ob Sie Root-Zugriff haben, indem Sie Ihr Passwort überprüfen und eine Konfigurationsdatei lesen. Wenn die Prüfung erfolgreich ist, ruft sie fork und execve auf, um den angeforderten Befehl auszuführen.

Um root-Privilegien in einer nicht privilegierten Anwendung zu erhalten, müssten Sie durch einige Ringe springen. Sie können fork/execve verwenden, um sudo für Ihren eigenen Befehl aufzurufen. Sobald Sie authentifiziert sind, haben Sie einen privilegierten Kindprozess. Sie könnten ein spezielles Argument oder eine Umgebungsvariable übergeben, sodass der untergeordnete Prozess zu Code springen kann, der privilegiert sein soll. Der übergeordnete Prozess wartet nur darauf, dass der untergeordnete Prozess abgeschlossen wird.

0

Bei UNIX-Systemen müssen Sie den setuid-Flag auf Ihrem Programm haben, und es sollte überprüfen/etc/passwd und/etc/shadow für gültige Anmeldeinformationen. Ich glaube, die crypt (3) -Funktion wird für das Passwort-Hashing verwendet. Ich bin mir nicht sicher über Mac.

+0

Nein, das funktioniert nicht auf dem Mac. –

+0

Ganz zu schweigen davon, dass dies für die Frage, die darin besteht, einen Sudo-Dialog anzuzeigen, irrelevant erscheint. –

+0

Mmmm, yeh Ich habe vergessen zu erwähnen, dass Sie getpass() verwenden können (was eigentlich veraltet ist), um das Echo der eingegebenen Zeichen im Terminal zu entfernen, während das Passwort eingegeben wird. – atx

1

Die Art zu tun, was Sie wollen auf dem Mac ist schreiben eine "faktorisierte Anwendung", bestehend aus dem Teil, der von einem Benutzer und dem Teil, der die privilegierte Aufgabe ausgeführt wird. Installieren Sie den privilegierten Teil in der Systemdomäne launchd, und rufen Sie das Benutzerwerkzeug für die Arbeit, für die spezielle Berechtigungen erforderlich sind, auf.

Sie müssen sicherstellen, dass nur autorisierte Verwendung des privilegierten Helfers auftreten kann, und Sie tun dies mit Authorization Services. Im Benutzerwerkzeug erhalten Sie ein "Recht", das Sie dann in ein externes Formular umwandeln und an den Helfer übergeben. Das Hilfsprogramm sollte überprüfen, ob es das richtige Recht hat, bevor es versucht, die privilegierte Arbeit auszuführen. Die andere Option besteht darin, das gesamte Tool so zu schreiben, dass es ordnungsgemäß fehlschlägt (was Sie in jedem Fall tun müssen), und die Benutzer bitten, es über sudo auszuführen, wenn sie privilegierten Zugriff benötigen. So funktioniert der Rest von UNIX.