J'ai un script à partir d'un crontab utilisateurs non privilégiés qui invoque certaines commandes à l'aide de Sudo
. Sauf que ça ne le fait pas. Le script fonctionne bien, mais les commandes sudo "échouent silencieusement.
Le script fonctionne parfaitement d'une coque comme l'utilisateur en question.
Sudo ne nécessite pas de mot de passe. L'utilisateur en question a (root) NOPASSWD: ALL
accès accordé dans /etc/sudoers
.
Cron est en cours d'exécution et exécute le script. Ajouter un simple date > /tmp/log
produit la production 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. Exécution env
de l'intérieur du script étant exécuté montre le bon $PATH
variable qui inclut le chemin de Sudo. Courir à l'aide d'un chemin complet ne vous aide pas. La commande étant exécutée est en train de donner le nom complet du chemin.
Essayer de capturer la sortie de la commande sudo, y compris STDERR, ne montre rien d'utile. Ajouter Sudo echo test 2>&1 > /tmp/log
au script produit un journal vide.
Le Sudo Binary lui-même s'exécute bien et reconnaît qu'il possède des autorisations même lorsqu'il est exécuté de Cron à l'intérieur du script. Ajouter Sudo -l > /tmp/log
au script produit la sortie:
L'utilisateur EC2-utilisateur peut exécuter les commandes suivantes sur cet hôte:
[.____] (root) nopasswd: tout
Examiner le code de sortie de la commande à l'aide de $?
montre qu'il renvoie une erreur (code de sortie: 1
), mais aucune erreur semble être produite. Une commande aussi simple que /usr/bin/Sudo /bin/echo test
Renvoie le même code d'erreur.
quoi d'autre pourrait se passer?
Il s'agit d'une machine virtuelle récemment créée en cours d'exécution des dernières AMI Amazon Linux. Le crontab appartient à l'utilisateur ec2-user
et le fichier sudoers est la défaillance de la distribution.
Sudo dispose de certaines options spéciales dans son fichier d'autorisations, dont l'une permet de restriction à son utilisation des coquillages qui sont en cours d'exécution à l'intérieur d'une TTY, que Cron n'est pas.
Certaines distributions comprenant l'Amazon Linux AMI ont cela activé par défaut. Les /etc/sudoers
Le fichier ressemblera à ceci:
# Disable "ssh hostname Sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname Sudo <cmd>".
#
Defaults requiretty
#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use Sudo without a tty. See requiretty above.
#
Defaults !visiblepw
Si vous aviez capturé la sortie à StDerr au niveau du script shell plutôt que sur la commande sudo elle-même, vous sembleriez un message comme celui-ci:
désolé, vous devez avoir un tty pour courir sudo
La solution consiste à permettre à Sudo d'exécuter dans des environnements non TTY en supprimant ou en commentant ces options:
#Defaults requiretty
#Defaults !visiblepw