Changer d'utilisateur en python
Je suis en train d'écrire un script simple qui redémarre une hadoop esclave. Dans le script, je dois faire quelques changements initiaux en tant qu'utilisateur racine. Après que j'ai changer d'utilisateur "hadoop" et d'effectuer des commandes. J'ai été en utilisant le système d'exploitation.système pour exécuter des commandes mais je doute que cela fonctionne bien. Par exemple:
uid=pwd.getpwnam('hadoop')[2]
os.setuid(uid)
os.system('whoami')
os.chdir('/home/hadoop/hadoop/')
os.system('bin/hadoop-daemon.sh stop tasktracker')
Encore, je dois effectuer certaines commandes en tant que root après cela, et redevenir utilisateur "hadoop" et de l'exécuter :
os.system('bin/hadoop-daemon.sh stop tasktracker')
J'ai trois questions ici ,
- Est os.le système est le meilleur de la commande que je peux utiliser pour émettre des commandes linux ?
- Je suis en mesure de changer de l'utilisateur root à l'utilisateur hadoop par la commande ci-dessus, mais je ne suis pas en mesure de changer pour l'utilisateur root (je peux comprendre, il y aura des problèmes de sécurité si elles le permettent, je veux savoir est-il possible de le faire , au moins en passant le mot de passe) ?
- Os.setuid ()? whoami imprime utilisateur hadoop, mais le processus de "tasktracker" n'est pas arrêté à l'aide de ces commande, mais si j'effectue les mêmes commandes manuellement, il fonctionne très bien (j'ai utiliser "su hadoop" au lieu de "setuid" tout en essayant manuellement).
Merci à tous pour votre aide.
- Sethu
OriginalL'auteur sethu | 2011-11-06
Vous devez vous connecter pour publier un commentaire.
vous pouvez utiliser:
ou si vous n'avez pas de sudo, mais ont su
Si la racine de l'utilisateur exécute le script python, toutes les commandes doivent être exécutées en tant que root, "sudo -u hadoop ...." exécute une commande comme si vous étiez l'utilisateur spécifié, et parce que vous exécutez cette commande en tant que root il devrait y avoir aucun mot de passe n'promt.
Pour savoir comment faire cela à l'aide de sous-processus, voir stackoverflow.com/questions/1770209/...
OriginalL'auteur Mike
Il est une meilleure idée d'utiliser "su" que pour passer l'ID de l'utilisateur à l'aide de l'os.setuid().
Pourquoi?
OriginalL'auteur MarkR
Ce genre de scripts peuvent être mis en œuvre beaucoup plus propre avec l'utilisation de la bibliothèque de tissu: http://docs.fabfile.org/en/1.3.1/index.html
En outre, il donne une belle interface de ligne de commande et les capacités des serveurs distants via ssh. Tous le python est disponible vous pouvez donc vous connecter à des bases de données par exemple, ou d'importer tout ce dont vous avez besoin.
Exactement la question sur l'exécution des commandes en tant qu'un autre utilisateur peut être mis en œuvre avec la commande sudo avec l'utilisateur arg: http://docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo
OriginalL'auteur Ivan Blinkov
Je n'ai pas fait moi-même mais je vois plusieurs os fonctions qui peuvent s'appliquer. Ils commencent ici: http://docs.python.org/library/os.html#os.setegid
Aussi, il y avait un thread sur le tuteur liste qui a abordé le sujet: http://mail.python.org/pipermail/tutor/2002-December/018981.html
La os.système approche est limitée, car il ne renvoie un code d'erreur. Le sous-processus.Popen ensemble d'outils est plus souple.
OriginalL'auteur Raymond Hettinger