web-dev-qa-db-fra.com

Changez en utilisateur Sudo dans un script python

J'ai un problème. J'écris un logiciel, qui est nécessaire pour effectuer une opération qui nécessite que l'utilisateur soit en mode Sudo. exécuter 'Sudo python filename.py' n'est pas une option, ce qui m'amène à ma question. Existe-t-il un moyen de passer à Sudo à mi-chemin à travers un script python, la sécurité n'est pas un problème car l'utilisateur connaîtra le mot de passe Sudo que le programme devrait exécuter de la manière suivante pour illustrer le problème

  1. programme fonctionnant en tant qu'utilisateur normal
  2. ...... effectuer des opérations
  3. l'utilisateur entre le mot de passe Sudo
  4. l'utilisateur a changé pour Sudo
  5. un sous-programme nécessitant l'autorisation de Sudo est exécuté
  6. au déclenchement même (fin du sous-programme) l'utilisateur redevient un utilisateur normal
  7. ...... effectuer des opérations

Mon problème réside dans l'étape 3, tous les pointeurs ou cadres que vous pourriez suggérer seraient d'une grande aide.

À votre santé

Chris

24
Kraken18

Utilisez Tcl et Expect, plus le sous-processus pour vous élever. Donc, fondamentalement, c'est comme ça:

Sudo.tcl

spawn Sudo
expect {
    "Password:" {
        send "password"
    }
}

Sudo.py

import subprocess
subprocess.call(['tclsh', 'Sudo.tcl'])

Et puis exécutez Sudo.py.

2
andrew

Il est préférable d'exécuter le moins de programme possible avec des privilèges élevés. Vous pouvez exécuter la petite partie qui a besoin de plus de privilèges via la fonction subprocess.call(), par ex.

import subprocess
returncode = subprocess.call(["/usr/bin/Sudo", "/usr/bin/id"])
18
nealmcb

N'essayez pas de vous faire Sudo, vérifiez simplement si vous êtes et erreur si vous n'êtes pas

class NotSudo(Exception):
    pass

if os.getuid() != 0:
    raise NotSudo("This program is not run as Sudo or elevated this it will not work")
9
Jakob Bowyer

J'ai récemment traité ce problème lors de la création d'un script d'installation système. Pour passer aux autorisations de superutilisateur, j'ai utilisé subprocess.call () avec 'Sudo':

#!/usr/bin/python

import subprocess
import shlex
import getpass

print "This script was called by: " + getpass.getuser()

print "Now do something as 'root'..."
subprocess.call(shlex.split('Sudo id -nu'))

print "Now switch back to the calling user: " + getpass.getuser()

Notez que vous devez utiliser shlex.split() pour rendre votre commande utilisable pour subprocess.call(). Si vous souhaitez utiliser la sortie d'une commande, vous pouvez utiliser subprocess.check_output(). Il existe également un package appelé 'sh' ( http://amoffat.github.com/sh/ ) que vous pouvez utiliser à cet effet.

5
Josh M

Si vous pouvez encapsuler uniquement les fonctionnalités nécessaires nécessitant des privilèges élevés dans un exécutable distinct, vous pouvez utiliser le bit setuid sur le programme exécutable , et l'appeler à partir de votre niveau utilisateur python.

De cette façon, seule l'activité de l'exécutable setuid s'exécute en tant que root, mais son exécution ne nécessite PAS Sudo, c'est-à-dire les privilèges root. Seule la création/modification de l'exécutable setuid nécessite Sudo.

Il y a quelques implications de sécurité, telles que la garantie que votre programme exécutable setuid désinfecte correctement toute entrée utilisateur (par exemple, les paramètres), de sorte qu'il ne puisse pas être incité à faire quelque chose qu'il ne devrait pas (problème d'adjoint confondu).

réf: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

edit: setuid ne semble fonctionner que pour les exécutables compilés (binaires) et non pour les scripts interprétés, vous devrez donc peut-être utiliser un wrapper setuid compilé.

2
user42935
import subprocess
subprocess.check_output("Sudo -i -u " + str(username) + " ls -l", Shell=True).decode("utf-8").strip()
0
Juan Medina

Vous pouvez utiliser setuid pour définir l'uid des utilisateurs. Mais pour des raisons de sécurité évidentes, vous ne pouvez le faire que si vous êtes root (ou si le programme a des droits root suid). Ces deux éléments sont probablement une mauvaise idée.

Dans ce cas, vous devez disposer des droits Sudo pour exécuter un programme spécifique. Dans ce cas, il vous suffit de vous reporter à "Sudo theprogram".

0
Lennart Regebro