web-dev-qa-db-fra.com

Comment puis-je utiliser une commande dans un script sans me demander 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 que Sudo demande à chaque fois le mot de passe?

105
Viswa

Remarque: Toute méthode impliquant de mettre votre mot de passe de connexion en texte brut, dans une commande ou dans un fichier, n'est pas sécurisée et ne doit PAS être utilisée!

méthode correcte pour configurer Sudotel que niquement la commande spécifique dont vous avez besoin, à savoir echo date... > rtc..., est autorisée à exécuter SANS avoir besoin du mot de passe.

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

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

  • Tapez Sudo visudo sur le terminal pour ouvrir le fichier de permissions Sudo (sudoersname__).
  • 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ù usernameest votre nom d'utilisateur:
    nom d'utilisateur ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Quittez l'éditeur (Ctrl+X si nano )

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

  • Changer la ligne à:
    os.system ('Sudo /home/username/pydatertc.sh')

Maintenant, votre script devrait fonctionner 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 une utilisation générale!):

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

147
ish

Attention!

Mettre votre mot de passe de connexion en texte brut, dans une commande ou un fichier, est extrêmement peu sûr et peut compromettre vos données personnelles et votre système. Il est vivement recommandé de ne jamais le faire, même si vous pensez que votre système est "personnel" ou dans un "endroit 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 le vol de votre compte, par exemple, 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

29
hytromo

Si cela ne vous dérange pas que le script soit exécuté à une heure précise (ou au cours de la journée), insérez-le dans le répertoire de base de la racine (/root) et exécutez le script à partir de la crontab système (/etc/crontab) en tant que root. Dans ce cas, vous n'aurez pas à compromettre votre sécurité.

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

21
z7sg

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

Par exemple, dans/etc/sudoers (ou l’un des fichiers qu’il contient), vous pouvez modifier la valeur par défaut:

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

Description complète de 'homme 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 à prendre en compte.

11
arielf
export MY_Sudo_PASS="user_password_here"

Pour vérifier si cela fonctionne, tapez:

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écuter à partir de python (exemple: changement de propriété de répertoire de manière récursive en nom_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)

le mot de passe de echo $ MY_Sudo_PASS get -S le détecte et le passe à Sudo

1
jturi