2013-02-19 7 views
18

Die Dokumentation für os.getuid() sagt:Was ist der Unterschied zwischen os.getuid() und os.geteuid()?

Rückkehr der Benutzer-ID des aktuellen Prozesses.

Und os.geteuid() sagt:

den aktuellen Prozess der ID effektiven Benutzer Return

.

Also, was ist der Unterschied zwischen Benutzer-ID und effektiven Benutzer-ID?

Für mich funktioniert beide gleich (auf beiden 2.x und 3.x). Ich verwende es um zu überprüfen, ob das Skript als root ausgeführt wird.

+0

Sie sind nicht identisch in Setuid-Programmen (und sie können für jedes Programm unterschiedlich sein, das als root ausgeführt wird und Seteuid explizit aufruft). Das bedeutet, dass sie * beim Start des Skripts identisch sind. –

Antwort

40

Um zu verstehen, wie os.getuid und os.geteuid unterscheiden, müssen Sie verstehen, dass sie nicht bestimmte Funktionen (außer dem os Modulpräfix) Python. Diese Funktionen wickeln die Systemaufrufe und geteuid ab, die im Wesentlichen von allen Unix-ähnlichen Betriebssystemen bereitgestellt werden.

Also, anstatt Python-Dokumente (die wahrscheinlich nicht viele Details geben) zu sehen, sollten Sie sich die Dokumente für Ihr Betriebssystem ansehen. Here ist die relevante Dokumentation für Linux zum Beispiel. Wikipedia hat auch eine gute article on Unix User IDs.

Der Unterschied zwischen der regulären UID und der effektiven UID besteht darin, dass nur die EUID überprüft wird, wenn Sie etwas tun, für das ein spezieller Zugriff erforderlich ist (z. B. Lesen oder Schreiben einer Datei oder bestimmte Systemaufrufe). Die UID gibt den tatsächlichen Benutzer an, der die Aktion ausführt, wird jedoch (normalerweise) nicht berücksichtigt, wenn Berechtigungen geprüft werden. In normalen Programmen werden sie gleich sein. Einige Programme ändern ihre EUID, um die Aktionen, die sie ausführen dürfen, zu addieren oder zu subtrahieren. Eine kleinere Zahl ändert auch ihre UID, um effektiv zu einem anderen Benutzer zu werden.

Hier ist ein Beispiel für ein Programm, das seine EUID ändert: Das Programm passwd (mit dem Sie Ihr Kennwort ändern) muss in die Kennwortdatei des Systems schreiben, die dem Benutzer root gehört. Normale Benutzer können nicht in diese Datei schreiben, da sie sonst das Passwort aller anderen ändern könnten. Um dies zu beheben, hat das Programm passwd ein Bit in seinen Dateiberechtigungen gesetzt (bekannt als setuid bit), das dem Betriebssystem anzeigt, dass es mit der EUID des Eigentümers des Programms ausgeführt werden soll (zB root), selbst wenn es von einem anderen Benutzer gestartet wird . Das Programm passwd würde dann seine UID als den startenden Benutzer und seine EUID als root sehen. Das Schreiben in die Systempasswortdatei erfordert, dass die EUID privilegiert ist. Die UID ist auch nützlich, da passwd wissen muss, für welchen Benutzer das Passwort geändert wird.

Es gibt ein paar andere Fälle, in denen die UID und EUID nicht übereinstimmen, aber sie sind nicht allzu häufig. Zum Beispiel kann ein Dateiserver, der als der Superbenutzer läuft, seine EUID ändern, um mit einem spezifischen Benutzer übereinzustimmen, der einige Dateimanipulationen anfordert. Durch die Verwendung der EUID des Benutzers kann der Server vermeiden, auf Dinge zuzugreifen, die der Benutzer nicht berühren darf.

6

Funktion os.getuid() gibt ID eines Benutzers zurück, der Ihr Programm ausführt. Funktion os.geteuid() eines Benutzers, für den Ihr Programm Berechtigungen verwendet. In den meisten Fällen wird dies dasselbe sein. Bekannter Fall, wenn diese Werte unterschiedlich sind, ist, wenn setuid Bit für Ihre ausführbare Programmdatei festgelegt ist, und Benutzer, der Ihr Programm ausführt, unterscheidet sich von Benutzer, die eigene ausführbare Programmdatei. In diesem Fall gibt os.getuid() die ID des Benutzers zurück, der das Programm ausführt, während os.geteuid() die ID des Benutzers zurückgibt, der das ausführbare Programm besitzt.

+0

Können Sie 'os.geteuid()' Teil erarbeiten? Und können Sie Beispiele geben, um zu zeigen, dass beide nicht gleich sind, d. H. * X * kann nur mit getuid und nicht geteuid erreicht werden, und * y * kann nur mit geteuid und nicht getuid erreicht werden? –