exécuter une commande en tant que super-utilisateur à partir d'un script python
Donc je vais essayer d'obtenir un processus pour s'exécuter en tant que super-utilisateur depuis un script python à l'aide de sous-processus. Dans le ipython shell quelque chose comme
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
fonctionne très bien, mais dès que j'ai le coller dans un script que j'ai commencer à obtenir: sudo: apach2ctl: command not found
.
Je suppose que cela est dû à la façon sudo poignées environnements sur ubuntu. (J'ai aussi essayé de sudo -E apche2ctl restart
et sudo env path=$PATH apache2ctl restart
avec en vain)
Donc ma question est, fondamentalement, si je veux courir apache2ctl restart
en tant que super utilisateur qui invite l'utilisateur à entrer le mot de passe super utilisateur lorsque requis, comment dois-je faire? Je n'ai pas l'intention de stocker les mots de passe dans le script.
Edit:
J'ai essayé en passant les commandes à la fois comme une chaîne de caractères et sous dans une liste. Dans l'interpréteur python, avec une chaîne, je vais obtenir l'invite de mot de passe correctement (ne marche pas encore dans un script python que dans mon problème d'origine), une liste donne juste l'écran d'aide pour sudo.
Edit 2:
Donc, ce que je comprends, c'est que tout Popen qui travaillent avec des commandes comme des chaînes lorsque le shell=True, il faut
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
sans "shell=True' pour obtenir sudo pour travailler.
Merci!
- Comment à propos de la configuration de sudo, de sorte que l'utilisateur peut exécuter simplement cette commande sans exiger un mot de passe?
- Vous pouvez utiliser
proc.wait()
en fonction de ce que vous faites;wait
ne pas continuer jusqu'à ce que le processus de l'enfant a fini de s'exécuter.
Vous devez vous connecter pour publier un commentaire.
Essayer de donner le chemin d'accès complet à apache2ctl.
Essayer:
subprocess.call(['sudo', 'apach2ctl', 'restart'])
Le sous-processus a besoin d'accéder au réel stdin/out/err pour être en mesure pour vous inviter, et de lire votre mot de passe. Si vous les définissez comme des tuyaux, vous avez besoin de nourrir le mot de passe dans le tuyau de vous-même.
Si vous ne définissez pas d'eux, puis il s'empare de sys.stdout, etc...
Une autre façon est de rendre votre utilisateur un mot de passe de moins en moins
sudo user
.Tapez la commande suivante sur la ligne de commande:
Puis ajouter les éléments suivants et remplacer le
<username>
avec la vôtre:Cela permettra à l'utilisateur d'exécuter
sudo
commande sans avoir à en demander le mot de passe (y compris l'application lancée par l'utilisateur. Cela peut être un risque pour la sécurité siVous devez utiliser Popen comme ceci:
Il attend une liste.
J'ai utilisé ce pour python 3.5. Je l'ai fait à l'aide de sous-processus module.En utilisant le mot de passe de ce genre est très insécurité.
La sous-processus module prend le commandement comme une liste de chaînes de caractères afin de créer une liste à l'avance à l'aide de split() ou de passer l'ensemble de la liste plus tard. Lire la documentation pour plus d'informations.
Ce que nous faisons ici, c'est l'écho le mot de passe et ensuite à l'aide de pipe, nous la transmettons à l'sudo par '-S' argument.
getpass
, ce qui rend votre première commande àcmd1 = subprocess.Popen(['echo',getpass.getpass('password:')], stdout=subprocess.PIPE)
ou ce Jozsef Turi mentionnéJ'ai essayé toutes les solutions, mais ne fonctionne pas. Voulu exécuter des tâches longues, avec du Céleri mais pour cela, j'ai besoin de lancer la commande sudo chown de commande avec des sous-processus.call().
C'est ce qui a fonctionné pour moi:
Pour ajouter coffre-fort variables d'environnement, dans la ligne de commande, tapez:
Pour tester si ça fonctionne type:
À exécuter au démarrage du système, l'ajouter à la fin de ce fichier:
Vous pouvez ajouter tous vos variables d'environnement les mots de passe, noms d'utilisateur, hôte, etc ici plus tard.
Si vos variables sont prêts, vous pouvez exécuter:
De mise à jour:
Ou à l'installation de Midnight commander
Pour commencer Midnight commander avec sudo
Ou de python shell (ou Django/Céleri), de changer le répertoire de la propriété de manière récursive:
Espère que cela aide.
La façon la plus sûre à faire est de demander le mot de passe à l'avance et puis il pipe dans la commande. Et vous demande le mot de passe permet d'éviter d'avoir le mot de passe enregistré n'importe où dans votre code, et il ne sera pas apparaître dans votre historique bash. Voici un exemple: