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
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
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.
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"])
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")
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.
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é.
import subprocess
subprocess.check_output("Sudo -i -u " + str(username) + " ls -l", Shell=True).decode("utf-8").strip()
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".