Cron n'utilise pas le chemin de l'utilisateur dont elle est la crontab et a le sien. Elle peut facilement être modifiée en ajoutant PATH=/foo/bar
au début de la crontab, et la solution classique consiste à toujours utiliser des chemins absolus pour les commandes exécutées par cron, mais où est défini le PATH par défaut de cron?
J'ai créé une crontab avec le contenu suivant sur mon système Arch (cronie 1.5.1-1) et également testé sur une boîte Ubuntu 16.04.3 LTS avec les mêmes résultats:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
C'est imprimé:
$ cat fff
/usr/bin:/bin
Mais pourquoi? Le chemin par défaut du système est défini dans /etc/profile
, mais cela inclut d'autres répertoires:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
Il n'y a rien d'autre de pertinent dans /etc/environment
ni /etc/profile.d
les autres fichiers que je pensais susceptibles d'être lus par cron:
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
Il n’ya rien de /etc/skel
surprenant non plus dans les /etc/cron*
fichiers qui se trouvent dans aucun fichier:
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
Alors, où est le PATH par défaut de cron pour les crontabs utilisateur en cours de définition? Est-ce qu'il est codé en dur cron
? Ne lit-il pas une sorte de fichier de configuration pour cela?
/etc/profile
car il utilise la même syntaxe ( var=value
) que cron
lui-même, il serait donc assez facile à faire et /etc/profile
est, à ma connaissance, très répandu. Ce qui m'a surpris, c'est que je ne pouvais pas le trouver installé nulle part, donc il semblait que c'était codé en dur. Comme c'est en effet le cas, comme l'a expliqué Stephen ci-dessous.
zsh
de shell interactif ne s’intéressent pas à la question /etc/profile
(ce qui est propre à bash
)
profile
fichiers ne sont lus que par des shells de connexion. Ceux-ci peuvent ou non être interactifs.
strings
contre un programme peut aussi aider à trouver ces valeurs codées en dur.
cron
de regarder/etc/profile
ou de s'intéresser à une coquille particulière. Une meilleure question est pourquoi ne pascron
lire àPATH
partir delogin.defs
(sous Linux) oulogin.conf
(* sur BSD). Je suppose que c'est finalement un détail de mise en œuvre.