Comment exécuter un travail cron à l'aide de la commande sudo

118

Est-il possible d'exécuter un travail cron nécessitant la commande sudo ?

Comme:

 sudo rm somefile
sayem siam
la source
Bienvenue, Sayem Siam, Consultez les réponses à cette question askubuntu.com/questions/2368/how-di-i-setup-cron-job . car je pense que votre question a déjà été posée ici sur AU
stephenmyall
1
J'essaie d'exécuter sudo qui a besoin d'un mot de passe, mais comment puis-je donner un mot de passe à partir du fichier cron
sayem siam
3
@sayemsiam vous n'avez pas besoin de mettre sudo, éditez simplement la crontab racine.
Braiam
Voir cette réponse .
sampablokuper

Réponses:

240

Je ne vais pas entrer dans combien c'est une mauvaise idée; Pour le dire simplement, si vous utilisez sudocrontab, votre mot de passe doit être stocké quelque part en texte clair.

C'est une mauvaise idée.


Voici la méthode recommandée pour exécuter des tâches administratives via cron. Puisque vous n'avez pas vraiment besoin d'écrire sudodans la crontab, modifiez la crontab de root.

Utilisez la crontab de root

Exécutez la commande suivante:

sudo crontab -e

Cela ouvre rootla crontab. sudon’est pas nécessaire d’exécuter votre commande dans ce contexte, car elle sera invoquée de roottoute façon.

Par conséquent, vous ajouterez simplement ce qui suit au fichier crontab de root.

@hourly rm somefile

Maintenant, si vous voulez absolument être dangereux et prendre des risques avec votre mot de passe, ce qui suit va exécuter votre commande à partir de votre propre crontab, et entrez votre mot de passe automatiquement lorsque vous y êtes invité sudo.

Encore une fois, ce n'est pas recommandé .


Dans votre propre crontab, écrivez votre commande comme suit:

@hourly echo "password" | sudo -S rm somefile

L'inconvénient évident est que, si jamais quelqu'un accédait à votre crontab, votre mot de passe serait lisible en texte brut.

Tu ne devrais pas faire ça.

SirCharlo
la source
1
Content que ça marche! Méfiez-vous des failles de sécurité que vous laissez derrière vous. Ils pourraient revenir plus tard pour vous hanter.
SirCharlo
1
@SirCharlo Pourquoi utiliser rootla crontab utilisateur plutôt que la crontab globale /etc/crontab?
Eliah Kagan
1
@ Elijah pourquoi pas?
SirCharlo
2
Cette réponse manque la cible, car elle dissimule les subtilités disponibles dans votre sudoersfichier, comme les groupes sudo sans mot de passe.
Brent
point très très utile, merci pour une aide précieuse.
Nasser Mansouri
33

Si vous mettez le script à partir de l’un des répertoires cron ( /etc/cron.*), vous n’avez pas besoin d’utiliser sudo car il s’exécute en tant que root.

Si vous utilisez crontab, vous voudrez utiliser crontab de root. Cela l'exécutera en tant que root et n'aura pas besoin de sudo.

sudo crontab -e
tgm4883
la source
1
Je placerais également la commande dans /etc/cron.hourly/something. C'est à quoi servent ces répertoires.
John S Gruber
3
Non, vous pouvez le mettre dans /etc/cron.SOMETHING/SCRIPT, mais je ne ferais pas les deux. Les deux donneraient à peu près la même fonction, bien qu'en utilisant crontab, vous ayez un peu plus de pouvoir sur la fréquence / le moment où les choses tournent.
tgm4883
1
J'aurais dû préciser que je voulais dire cela comme une alternative. Merci.
John S Gruber
3

Exécuter la commande suivante dans le terminal

sudo visudo

Ajout de la ligne suivante à la fin du fichier:

vidyadhar  ALL= NOPASSWD: /bin/rm

Dans l'exemple ci-dessus, vidyadhar est le nom d'utilisateur et il ne vous demandera pas de mot de passe si vous exécutez la commande rm via vidyadhar.

Vidyadhar
la source
17
Hmm .. Ensuite, toute commande malveillante, comme sudo rm -rf 'slash'( ne pas exécuter cette commande ), exécutée à partir de cet utilisateur, ne nécessiterait aucun mot de passe .. Je ne sais pas, cela ne semble pas être sûr, non?
SirCharlo
Ya je le sais. Votre approche est bonne. Mais j'utilise l'approche ci-dessus pour donner le droit à un autre utilisateur d'arrêter / démarrer certains services.
Vidyadhar
24
C'est une très mauvaise idée. S'il vous plaît ne faites pas ça.
bkanuka
2
Peut vidyadhar ALL= NOPASSWD: /bin/rm somefile-être serait plus sécurisé.
Wernfried Domscheit
C'est une idée terrible. Vous avez donné des autorisations sudo générales à rm. Au lieu de cela, accordez des autorisations sudo à un script de votre commande, y compris rm ou à d'autres personnes de ce script, pour le rendre exécutable, puis accordez des autorisations sudo à ce script. <username> ALL=(ALL) NOPASSWD: /home/<username>/bin/<script>, ce qui serait beaucoup plus sûr.
RJ