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?
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 Sudo
tel 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.
gedit
(ou votre éditeur favori) et créez le script, par exemple. pydatertc.sh
echo date\'+% s \' -d\'+ 24 heures \'>/sys/class/rtc/rtc0/wakealarm
Sudo chown root:root /home/username/pydatertc.sh
Sudo chmod 700 /home/username/pydatertc.sh
pydatertc.sh
de s'exécuter sans mot de passeSudo visudo
sur le terminal pour ouvrir le fichier de permissions Sudo (sudoers
name__).%Sudo ALL=(ALL:ALL) ALL
username
est votre nom d'utilisateur: nom d'utilisateur ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
pydatertc.sh
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!
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 Sudo
de votre appel Python, en laissant sh -c "...."
intact.
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
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.
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.
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