Comment puis-je effectuer une commande dans un script sans me demander un mot de passe?

107

Je veux allumer mon système automatiquement tous les jours. J'utilise donc le code ci-dessous dans mon script Python, mais sudome 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 sudodemander le mot de passe à chaque fois?

Viswa
la source
4
Vous devriez regarder dans le manuel de votre carte mère ou dans le BIOS pour voir si elle supporte ce comportement. Je sais que ça évite la question! =] Mais cela peut être une solution suffisante.
Alex Hirzel

Réponses:

149

Remarque: toute méthode qui implique 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!

La façon correcte de le faire pour configurer de sudotelle sorte que seule la commande spécifique dont vous avez besoin, à savoir echo date... > rtc..., est autorisée à s'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 préféré) et créez le script, par exemplepydatertc.sh
  • N'insérez que cette ligne et enregistrez-la, par exemple, dans votre répertoire personnel:
    echo date \ '+% s \' -d \ '+ 24 heures \'> / sys / class / rtc / rtc0 / wakealarm
  • Quittez l'éditeur et, à partir du terminal, exécutez le script et changez son propriétaire en root . Sinon, un autre utilisateur ayant accès à votre système pourrait le modifier et exécuter les commandes de son choix en tant qu'utilisateur 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 l’ pydatertc.shexécution sans mot de passe

  • Tapez sudo visudosur le terminal pour ouvrir le sudoersfichier sudo permissions ( )
  • Autour de la ligne 25, vous verrez cette ligne: %sudo ALL=(ALL:ALL) ALL
  • Sous cette ligne , insérez la ligne suivante, où usernameest votre nom d'utilisateur:
    nom d'utilisateur ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Quitter l'éditeur ( Ctrl+ Xsi 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 usage général!):

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

ish
la source
1
Génial, c'est la bonne façon de le faire.
roadmr
1
Une réponse aussi détaillée et utile, et comment cela devrait être fait.
ArtOfCode
@RobertRosati, merci beaucoup pour votre suggestion de modification - je n'aurais jamais dû oublier cela!
Ish
1
@ m-ric Avez-vous lu la commande au-dessus de ces lignes? "Sinon, un autre utilisateur ayant accès à votre système pourrait éventuellement le modifier et exécuter toutes les commandes de son choix en tant qu'utilisateur root sans avoir besoin de votre mot de passe"
Tobias Kienzler
2
Je me rends compte que cette réponse est ancienne - mais il y a toujours un problème: si le fichier se trouve dans / home / nom d'utilisateur , le système peut être compromis si ce répertoire est accessible en écriture par un utilisateur malveillant (ou par un nom d'utilisateur non root). compromis) . Ils pourraient supprimer ou renommer le fichier, mettre un autre script à sa place et exécuter ce script via sudo- sans mot de passe. Il est donc beaucoup plus prudent de placer le script dans un répertoire que seule la racine peut modifier, par exemple: / usr / sbin ou / root . Sinon, c'est LGTM.
NVRAM
30

Attention!

Mettre votre mot de passe de connexion en texte brut, dans une commande ou un fichier, est extrêmement peu sécurisé 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 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

Hytromo
la source
13
@Viswa, S'il vous plaît noter que, il est très très dangereux de révéler le mot de passe en texte brut. Nous vous conseillons vivement de ne pas faire cela
Anwar
3
-1 Si cela vous semble une bonne idée, vous feriez mieux de simplement définir un mot de passe sur votre compte root et d'utiliser la solution de z7sg; c'est tout aussi facile et ne crée pas ce problème de sécurité très dangereux.
Bryce
4
Hah! J'ai eu 6 votes positifs et 4 votes négatifs sur ma réponse :) Mais pourquoi les gars, est-ce que je n'étais pas clair dans les termes 'usage personnel', 'endroit sûr', etc.? Il n'y a pas de problème de sécurité sauf si vous donnez ce fichier et que vous avez un serveur ssh en cours d'exécution! Où voyez-vous le problème de sécurité à condition que le script soit à usage personnel et en lieu sûr?
hytromo
5
Downvoted, ceci est la route vers le côté obscur, et n'est pas nécessaire avec la méthode sudo.
Floyd
4
Ok, dites-moi, même si le pirate informatique s'est connecté en tant qu'utilisateur simple à votre compte, comment diable trouvera-t-il le script avec votre mot de passe sous / usr / share / help / lv / ubuntu-help?
hytromo
21

Si cela ne vous dérange pas que le script s'exécute à 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 commande système crontab ( /etc/crontab) en tant que racine. 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.

z7sg
la source
4
Vous voudrez peut-être utiliser anacrons'il s'agit d'un ordinateur de bureau / ordinateur portable qui ne fonctionne pas 24x7
mercredi
C'est une réponse utile. Par exemple, si vous écrivez le script pour rechercher des mises à jour, effectuez quelque chose avec ces informations et envoyez un courrier électronique à l'administrateur pour lui indiquer les mises à jour nécessaires. Personnellement, beaucoup de mes scripts sont utilisés pour l’automatisation du serveur, donc utiliser sudo crontab -e est ce que j’aurais tendance à faire. +1
Rab
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 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.

arielf
la source
0
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 (par exemple, changer la propriété du répertoire de manière récursive en 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)

Le mot de passe de echo $ MY_SUDO_PASS get -S le détecte et le passe à sudo

jturi
la source
Je ne suis pas sûr de ce que cela ajoute aux réponses existantes au support BIOS le plus récent, réveillez-vous au réveil ...
Elder Geek