J'ai un script exécuté à partir de la crontab d'un utilisateur non privilégié qui appelle certaines commandes à l'aide sudo
. Sauf que non. Le script s'exécute correctement mais les commandes sudo'ed échouent silencieusement.
Le script fonctionne parfaitement à partir d'un shell en tant qu'utilisateur en question.
Sudo n'a pas besoin de mot de passe. L'utilisateur en question dispose d'un
(root) NOPASSWD: ALL
accès autorisé dans/etc/sudoers
.Cron exécute et exécute le script. L'ajout d'une
date > /tmp/log
sortie simple produit au bon moment.Ce n'est pas un problème d'autorisations. Encore une fois, le script est exécuté, mais pas les commandes sudo'ed.
Ce n'est pas un problème de chemin. L'exécution
env
depuis l'intérieur du script en cours d'exécution affiche la$PATH
variable correcte qui inclut le chemin vers sudo. L'exécuter en utilisant un chemin complet n'aide pas. La commande en cours d'exécution reçoit le nom de chemin complet.Essayer de capturer la sortie de la commande sudo, y compris STDERR, n'affiche rien d'utile. L'ajout
sudo echo test 2>&1 > /tmp/log
au script produit un journal vide.Le binaire sudo lui-même s'exécute correctement et reconnaît qu'il dispose d'autorisations même lorsqu'il est exécuté à partir de cron à l'intérieur du script. L'ajout
sudo -l > /tmp/log
au script produit la sortie:L'utilisateur ec2-user peut exécuter les commandes suivantes sur cet hôte:
(root) NOPASSWD: ALL
L'examen du code de sortie de la commande à l'aide $?
montre qu'elle renvoie une erreur (code de sortie:) 1
, mais aucune erreur ne semble se produire. Une commande aussi simple que /usr/bin/sudo /bin/echo test
renvoie le même code d'erreur.
Que pourrait-il se passer d'autre?
Il s'agit d'une machine virtuelle récemment créée exécutant la dernière AMI Amazon Linux. La crontab appartient à l'utilisateur ec2-user
et le fichier sudoers est la distribution par défaut.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
et mon cerveau a commencé à crier trop fort pour continuer à lire.sudo
droits restreints / uniquement / pour les commandes dont vous avez besoin dans le script et de désactiver complètement leur capacité de connexion.Réponses:
Sudo a des options spéciales dans son fichier d'autorisations, dont l'une permet une restriction de son utilisation aux shells qui s'exécutent à l'intérieur d'un ATS, ce qui n'est pas le cas.
Certaines distributions, y compris l'AMI Amazon Linux, ont cette option activée par défaut. Le
/etc/sudoers
fichier ressemblera à ceci:Si vous aviez capturé la sortie vers STDERR au niveau du script shell plutôt que la commande sudo elle-même, vous auriez semblé un message quelque chose comme ceci:
La solution consiste à permettre à sudo de s'exécuter dans des environnements non TTY en supprimant ou en commentant ces options:
la source
Defaults !visiblepw
est activé / non commenté.