Comment créer une commande dans un script sans demander de mot de passe?

101

Je veux activer mon système automatiquement tous les jours. Donc, j'utilise 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 que sudo demande le mot de passe à chaque fois?

    
posée Viswa 25.06.2012 - 15:30
la source

5 réponses

138
  

Remarque: Toute méthode consistant à placer votre mot de passe en texte brut, dans une commande ou dans un fichier, n’est pas sûre et ne doit PAS être utilisée!

La manière correcte de le faire pour configurer sudo de telle sorte que uniquement la commande spécifique dont vous avez besoin, c.-à-d. echo date... > rtc... , est autorisée à s'exécuter mot de passe.

Étape 1. Créez un script shell avec cette seule commande

  • Ouvrez gedit (ou votre éditeur favori) et créez le script, par ex. pydatertc.sh
  • Insérez uniquement cette ligne et enregistrez-la sur, par ex. votre répertoire personnel:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Quittez l'éditeur et, à partir du terminal, rendez le script exécutable et changez de propriétaire pour root , sinon un autre utilisateur ayant accès à votre système pourrait le modifier et exécuter les commandes de leur choix en tant que root 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 permettre à pydatertc.sh de s’exécuter sans mot de passe

  • Tapez sudo visudo sur le terminal pour ouvrir le fichier d'autorisations sudo ( sudoers )
  • Autour de la ligne 25, vous verrez cette ligne: %sudo ALL=(ALL:ALL) ALL
  • En dessous de cette ligne , insérez la ligne suivante, où username correspond à votre nom d'utilisateur:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Quittez l'éditeur ( Ctrl + X si nano )

Étape 3. Modifiez votre script python pour appeler pydatertc.sh

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

Votre script doit maintenant s'exécuter sans 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!):

Dans ce cas spécifique uniquement , le fichier /sys/class/rtc/rtc0/wakealarm ne contrôlant que l’alarme de réveil du système et étant par ailleurs inoffensif, une autre alternative pour éviter le mot de passe consiste à fichier avec chown (si vous êtes le seul utilisateur à définir l'alarme), ou le rendre accessible en écriture avec chmod +666 ; dans ce cas, supprimez simplement sudo de votre appel Python, en laissant sh -c "...." intact.

    
réponse donnée ish 25.06.2012 - 16:53
la source
29
  

Avertissement!

     

Mettre votre mot de passe en texte brut, dans une commande ou dans un fichier, n’est pas sûr du tout et peut compromettre vos données privées et votre système. Il est fortement recommandé de ne jamais le faire, même si vous pensez que votre système est "personnel" ou "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 n’avez pas peur du vol de votre compte, alors voici une solution simple:

echo LOGINPASSWD | sudo -S COMMAND HERE

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

    
réponse donnée hytromo 25.06.2012 - 15:38
la source
21

Si le script ne fonctionne pas à une heure précise de l’heure (ou du jour), placez-le dans le répertoire de base de root ( /root ) et exécutez le script à partir du crontab du système ( /etc/crontab ) en tant que root. Vous n'aurez alors pas à compromettre votre sécurité.

Voir lien pour savoir comment ajouter le script à la crontab.

    
réponse donnée z7sg 25.06.2012 - 15:49
la source
11

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 des mots de passe.

Exemple, dans / etc / sudoers (ou l’un des fichiers inclus), 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 particulier de l'exécution de la commande depuis cron. Mais c'est une bonne chose à savoir.

    
réponse donnée arielf 29.06.2012 - 23:10
la source
1
export MY_SUDO_PASS="user_password_here"

Pour tester si c'est le type de travail:

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 avions créé auparavant:

echo $MY_SUDO_PASS | sudo -S apt-get update

Exécution à partir de python (exemple: modification récursive de la propriété du répertoire à username_here):

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 obtenir le mot de passe -S passer le mot de passe à sudo

    
réponse donnée Jozsef Turi 15.03.2018 - 17:59
la source

Lire d'autres questions sur les étiquettes