web-dev-qa-db-fra.com

Pourquoi Cron ne manquera-t-il pas d'exécuter Sudo Stuff dans mon script?

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.

31
Caleb

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
41
Caleb