115 votes

Comment faire pour sudo une commande dans un script sans qu'on me demande un mot de passe ?

Je veux allumer mon système automatiquement tous les jours. J'utilise donc le code ci-dessous dans mon script Python, mais sudo me demande un mot de passe à chaque fois :

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Comment puis-je exécuter ce script sans sudo demandant le mot de passe à chaque fois ?

164voto

ish Points 134738

Veuillez noter : Toute méthode qui consiste à mettre votre mot de passe de connexion en texte clair, dans une commande ou dans un fichier, n'est pas sûre et ne doit PAS être utilisée !

La bonne méthode de le faire pour mettre en place sudo tal que seulement la commande spécifique dont vous avez besoin, c'est-à-dire echo date... > rtc... est autorisé à fonctionner SANS avoir besoin du mot de passe.

Étape 1. Créez un Shell Shell avec juste cette commande

  • Ouvrez gedit (ou votre éditeur préféré), et créez le script, par exemple pydatertc.sh
  • N'insérez que cette ligne, et enregistrez-la dans votre répertoire personnel, par exemple : echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Quittez l'éditeur, et à partir du terminal, rendez le script exécutable y changer sa propriété pour racine sinon un autre utilisateur ayant accès à votre système pourrait le modifier et exécuter les commandes qu'il souhaite en tant que racine sans avoir besoin de votre mot de passe :

    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

Étape 2. Configurez sudo pour autoriser pydatertc.sh à exécuter sans demander un mot de passe

  • Type sudo visudo au terminal pour ouvrir les permissions sudo ( sudoers ) fichier
  • Vers la ligne 25, vous verrez cette ligne : %sudo ALL=(ALL:ALL) ALL
  • En dessous de cette ligne insérer la ligne suivante, où username est votre nom d'utilisateur : username ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Quitter l'éditeur ( Ctrl + X si nano )

Étape 3. Modifiez votre script de Python pour appeler pydatertc.sh

  • Changez la ligne en : os.system('sudo /home/username/pydatertc.sh')

Maintenant votre script devrait s'exécuter sans nécessiter de mot de passe ET sans compromettre la sécurité de votre compte, de vos données ou de votre système !


Alternative uniquement pour wakealarm (pas pour un usage général !) :

Sur ce cas spécifique uniquement puisque le /sys/class/rtc/rtc0/wakealarm ne contrôle que l'alarme de réveil du système et est autrement inoffensif, une autre alternative pour éviter le mot de passe est soit de prendre la propriété de ce fichier avec chown (si vous êtes le seul utilisateur à régler l'alarme), ou le rendre inscriptible dans le monde entier avec chmod +666 dans ce cas, il suffit de supprimer le sudo de votre appel Python, laissant sh -c "...." intact.

32voto

hytromo Points 4759

Attention !

Mettre votre mot de passe de connexion en texte clair, dans une commande ou un fichier, c'est extrêmement non sécurisé et peut compromettre vos données privées et votre système. Il est hautement recommandé Ne faites jamais cela même si vous pensez que votre système est " personnel " ou dans un " lieu sûr " !

Si le script est uniquement destiné à un usage personnel et que vous l'avez placé dans un endroit sûr et que vous ne craignez pas que votre compte soit volé et autres, alors voici une solution simple :

echo LOGINPASSWD | sudo -S COMMAND HERE

où LOGINPASSWD est votre mot de passe de connexion (exemple : iloveponies) et COMMAND HERE est votre commande qui vient après sudo, comme sh -c "echo da.. etc

21voto

Evan Broder Points 821

Si cela ne vous dérange pas que le script s'exécute à un moment précis de l'heure (ou de la journée), mettez-le dans le répertoire personnel de root ( /root ), et exécuter le script à partir de la crontab du système ( /etc/crontab ) comme racine. Ainsi, vous n'aurez pas à compromettre votre sécurité.

Ver https://help.ubuntu.com/community/CronHowto pour savoir comment ajouter le script à la crontab.

11voto

arielf Points 2623

Une autre fonctionnalité intéressante de sudo qui n'a pas été mentionnée dans les excellentes réponses ci-dessus est la variable 'timestamp_timeout'. C'est une variable sudo que vous pouvez augmenter pour économiser sur la saisie interactive du mot de passe.

Par exemple, dans le fichier /etc/sudoers (ou l'un des fichiers inclus dans celui-ci), vous pouvez modifier la valeur par défaut :

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Description complète de "man sudoers" :

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Bien sûr, cela ne peut pas aider dans le cas spécifique de l'exécution de la commande à partir de cron. Mais c'est une bonne chose à savoir.

1voto

jturi Points 229
export MY_SUDO_PASS="user_password_here"

Pour tester si le type fonctionne :

echo $MY_SUDO_PASS
> user_password_here

Pour exécuter "sudo apt-get update", et accepter le mot de passe des variables d'environnement que nous avons créées auparavant :

echo $MY_SUDO_PASS | sudo -S apt-get update

Exécution à partir de Python (exemple : changement récursif de la propriété du répertoire en nom d'utilisateur_ici) :

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $MY_SUDO_PASS obtient le mot de passe -S switch l'attrape et passe le mot de passe à sudo

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X