L'utilisation de sudo avec un script Python
Je suis en train d'écrire un petit script pour monter une VirtualBox dossier partagé à chaque fois que j'execute le script. Je veux le faire avec Python, parce que je suis en train de l'apprendre pour l'écriture de scripts.
Le problème est que j'ai besoin de privilèges pour le lancement de la commande mount. Je pourrais exécuter le script que sudo, mais je la préfère à faire sudo par son propre.
Je sais déjà qu'il n'est pas sûr d'écrire votre mot de passe dans une .py fichier, mais nous parlons d'une machine virtuelle qui n'est pas critique du tout: je veux juste cliquez sur le .py script et de le faire fonctionner.
C'est ma tentative:
#!/usr/bin/env python
import subprocess
sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'
subprocess.Popen('sudo -S' , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(sudoPassword , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)
Ma version de python est de 2,6
- Est-il une raison pour ne pas utiliser
/etc/fstab
? - oui, que je me sers pour apprendre à utiliser python pour ce genre de but
- vous devez passer le mot de passe sur stdin, voir ce stackoverflow.com/a/165662/894872
- Si vous ne savez pas ce que vous faites, à éviter
shell=True
. Si vous ne pouvez pas faire fonctionner les choses, sans elle, savoir ce qu'il fait et comment il fonctionne (et puis vous pouvez généralement).
Vous devez vous connecter pour publier un commentaire.
Essayer cela et laissez-moi savoir si cela fonctionne. 🙂
Et celui-ci:
os.popen("sudo -S %s"%(command), 'w').write('mypass')
os.system('echo %s|sudo -S %s' % (sudoPassword, command))
, parce qu'il apporte un trou de sécurité. Par la rédaction de votre mot de passe de commande shell, il devient accessible à travers.bash_history
fichier et en exécutanthistory
commande shell. Toujours de passe mot de passe via stdin que c'est plus sécuritaire.foo$(rm -rf /*)bar
? Voyez-vous le problème avec ça.De nombreuses réponses se concentrent sur la façon de faire de votre solution de travail, bien que très peu d'suggèrent que votre solution est un très mauvais approche. Si vous voulez vraiment "d'apprendre", pourquoi ne pas le pratiquer à l'aide de bonnes solutions? Coder en dur de votre mot de passe est l'apprentissage de la mal approche!
Si ce que vous voulez vraiment est un mot de passe de moins en moins
mount
pour ce volume, peut-êtresudo
n'est pas nécessaire à tous les! Donc, puis-je suggérer d'autres approches?Utilisation
/etc/fstab
comme mensi suggéré. Utilisez les optionsuser
etnoauto
de laisser les utilisateurs réguliers montez le volume.Utilisation
Polkit
pour les actions sans mot de passe: Configurer un.policy
fichier pour votre script avec<allow_any>yes</allow_any>
et la chute de/usr/share/polkit-1/actions
Modifier
/etc/sudoers
pour permettre à vos utilisateurs d'utilisersudo
sans avoir à taper votre mot de passe.Tous les ci-dessus permettent les privilèges de root sans mot de passe, aucun besoin pour vous de coder en dur de votre mot de passe. Choisissez n'importe quelle approche, et je peux l'expliquer plus en détail.
Comme pour pourquoi c'est une très mauvaise idée de coder en dur les mots de passe, voici quelques liens pour en savoir plus:
À passer le mot de passe pour
sudo
s'stdin:Remarque: vous pourriez probablement configurer sudo sans mot de passe ou
SUDO_ASKPASS
de commande au lieu de coder en dur de votre mot de passe dans le code source.can only concatenate list (not “str”) to list
je l'ai changé pourPopen(['sudo -S ' + command]
- Qui a fonctionné pour moi. Il semble que, au moment de répondre à cette ajoutés à une liste implicitement.. ce qui n'est plus autorisé? ou pris en charge...split()
. Comparer avec votre code.subprocess.Popen
crée un processus et ouvre des tuyaux et des trucs. Ce que vous faites est:sudo -S
mypass
mount -t vboxsf myfolder /home/myuser/myfolder
qui n'est évidemment pas d'aller travailler. Vous devez passer les arguments à Popen. Si vous regardez sa documentation, vous remarquerez que le premier argument est en fait une liste d'arguments.
Utiliser l'option-S dans la commande sudo qui raconte à lire le mot de passe 'stdin' au lieu du terminal.
Dire Popen à lire stdin de la conduite.
Envoyer le Mot de passe pour le stdin conduite du processus en l'utilisant comme un argument pour communiquer méthode. Ne pas oublier d'ajouter un caractère de nouvelle ligne, '\n', à la fin du mot de passe.
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. Lisez la documentation pour moreinformation.
S'il vous plaît essayer module pexpect. Voici mon code:
À la limite de ce que vous exécuter en tant qu'sudo, vous pouvez exécuter
sans avoir besoin de stocker le mot de passe. Le
-E
paramètre passe de votre utilisateur courant env dans le processus. Notez que votre shell aura sudo privilèges après la deuxième commande, donc à utiliser avec précaution!parfois besoin d'un retour chariot:
Je sais qu'il est toujours préférable de ne pas coder en dur le sudo mot de passe dans le script. Cependant, pour une raison quelconque, si vous n'avez pas la permission de modifier
/etc/sudoers
ou de changement de propriétaire du fichier, Pexpect est une alternative possible.Ici est une fonction Python
sudo_exec
pour votre référence: