web-dev-qa-db-fra.com

Quelle est la différence entre os.getuid () et os.geteuid ()?

La documentation de os.getuid() dit:

Renvoie l'ID utilisateur du processus en cours.

Et de os.geteuid() dit:

Renvoie l'ID utilisateur effectif du processus en cours.

Alors, quelle est la différence entre id utilisateur et id utilisateur effectif?

Pour moi, les deux fonctionnent de la même manière (à la fois sur 2.x et 3.x) . Je l'utilise pour vérifier si le script est exécuté en tant que root.

32
Santosh Kumar

Pour comprendre comment os.getuid et os.geteuid diffèrent, vous devez comprendre qu'elles ne sont pas des fonctions spécifiques Python (autres que le préfixe du module os). Ces fonctions enveloppent le getuid et geteuid appels système fournis par pratiquement tous les systèmes d'exploitation de type Unix.

Donc, plutôt que de regarder Python docs (qui ne sont pas susceptibles de donner beaucoup de détails), vous devriez regarder les docs de votre système d'exploitation. Ici est la documentation pertinente pour Linux, par exemple. Wikipédia a aussi un bon article sur les ID utilisateur Unix .

La différence entre l'UID normal et l'UID effectif est que seul l'EUID est vérifié lorsque vous faites quelque chose qui nécessite un accès spécial (comme lire ou écrire un fichier, ou effectuer certains appels système). L'UID indique l'utilisateur réel qui exécute l'action, mais il n'est (généralement) pas pris en compte lors de l'examen des autorisations. Dans les programmes normaux, ils seront les mêmes. Certains programmes modifient leur EUID pour ajouter ou soustraire des actions qu'ils sont autorisés à prendre. Un plus petit nombre modifie également son UID pour "devenir" effectivement un autre utilisateur.

Voici un exemple de programme qui change son EUID: Le programme passwd (qui est utilisé pour changer votre mot de passe) doit écrire dans le fichier de mot de passe du système, qui appartient à l'utilisateur root. Les utilisateurs réguliers ne peuvent pas écrire dans ce fichier, car s'ils le pouvaient, ils pourraient également changer le mot de passe de tout le monde. Pour résoudre ce problème, le programme passwd a un bit défini dans ses autorisations de fichier (appelé setuid bit) qui indique au système d'exploitation qu'il doit être exécuté avec l'EUID du propriétaire du programme (par exemple root) même lorsqu'il est lancé par un autre utilisateur. Le programme passwd verrait alors son UID comme utilisateur de lancement et son EUID comme root. L'écriture dans le fichier de mot de passe système nécessite que l'EUID soit privilégié. L'UID est également utile, car passwd a besoin de savoir pour quel utilisateur il modifie le mot de passe.

Il y a quelques autres cas où l'UID et l'EUID ne correspondent pas, mais ils ne sont pas trop courants. Par exemple, un serveur de fichiers fonctionnant en tant que super-utilisateur peut changer son EUID pour correspondre à un utilisateur spécifique qui demande des manipulations de fichier. L'utilisation de l'EUID de l'utilisateur permet au serveur d'éviter d'accéder à des choses que l'utilisateur n'est pas autorisé à toucher.

55
Blckknght

La fonction os.getuid() renvoie l'ID d'un utilisateur qui exécute votre programme. Fonction os.geteuid() d'un utilisateur dont votre programme utilise les autorisations. Dans la plupart des cas, ce sera la même chose. Le cas bien connu où ces valeurs seront différentes est lorsque setuid bit est défini pour le fichier exécutable de votre programme et que l'utilisateur qui exécute votre programme est différent de l'utilisateur qui possède l'exécutable du programme. Dans ce cas, os.getuid() renverra l'ID de l'utilisateur qui exécute le programme, tandis que os.geteuid() renverra l'ID de l'utilisateur qui possède l'exécutable du programme.

6
Mikhail Vladimirov