2009-10-28 22 views
3

Est-il possible de demander une racine pw sans stocker dans ma mémoire de script et d'exécuter certaines des commandes os. * En tant que root?Comment exécuter les méthodes os. * En tant que root?

Mon script

  1. scanne certains dossiers et fichiers pour vérifier si elle peut faire le travail
  2. fait quelques changements dans/etc/...
  3. crée un dossier et les fichiers qui doivent être la propriété par l'utilisateur qui a exécuté le script

(1) peut être effectué en tant qu'utilisateur normal. Je peux faire (2) par le sudoing le script, mais alors le dossier et les fichiers dans (3) seront root. Le problème est que j'utilise beaucoup de os.makedirs, os.symlink, etc, ce qui m'empêche de le rendre exécutable par un utilisateur normal.

Réservoirs 2 toutes les suggestions

La solution à ce jour est la suivante:

# do all in sudo 
os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID'))) 

grâce à gnibbler pour soupçon.

+2

Vous devrez créer les dossiers et les fichiers en tant que root, puis utiliser 'os.chown' pour changer la propriété de l'utilisateur correct –

+0

Cela a fonctionné! os.chown (chemin, pwd.getpwnam (os.getenv ('SUDO_USER')) [2]) –

Répondre

1

gnibbler a donné un indice à os.chown. Le problème était alors de connaître l'identifiant de l'utilisateur derrière sudo.Ces informations sont stockées dans des variables d'environnement SUDO_*:

os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID'))) 

Fractionnement le code dans 3 fichiers pourrait être une solution, mais le code est déjà mélangé, de sorte que ce n'est pas approprié.

2

Peut-être que vous pouvez mettre (2) dans un script séparé, par exemple script2.py, et dans le script principal vous appelez sudo script2.py avec un popen?

De cette façon seulement (2) sera exécuté en tant que root.

+0

S'il n'y a pas d'autre moyen, je vais essayer, mais maintenant (1) et (2) sont mélangés bit. –

1

Envisageriez-vous d'utiliser Linux PAM? Vous voudrez peut-être jeter un oeil à la Linux-PAM Application Developers' Guide et Python API for PAM

+0

Chose intéressante, merci, mais trop compliqué dans ce cas, IMO. –

+0

:) Je me demandais aussi. Mais de toute façon, vous pouvez garder à l'esprit pour des besoins plus complexes. Merci pour le +1. –

2

yourscript.py:

run_part_1() 
subprocess.call(['sudo', sys.executable, 'part2.py']) 
run_part_3() 

part2.py:

run_part_2() 
1

Vous devez exécuter votre script en tant que root et faire les changements appropriés aux autorisations pour (3) en utilisant os.chmod et os.chown. Il serait possible pour vous d'exécuter un autre script avec des droits root via sudo, mais cela nécessiterait également de stocker le mot de passe de votre utilisateur dans le script pour passer à sudo, ce qui est une idée terrible du point de vue de la sécurité.

Ainsi, votre problème consiste à obtenir les autorisations correctes sur certains fichiers/dossiers. Tout d'abord, passez ou codez le UID/nom d'utilisateur de votre utilisateur habituel. Ensuite, utilisez os.chown pour changer le propriétaire, et os.chmod pour changer les permissions. Il existe également d'autres méthodes chown/chmod dans le paquet os que vous devriez regarder: http://docs.python.org/library/os.html

Une note finale: Vous n'avez pas à vous soucier des permissions des liens symboliques. Ils ont les permissions de ce qu'ils désignent.

+0

Pas besoin de coder en dur ce que je peux obtenir avec os.getenv ('SUDO_UID'). –