Comment exécuter crontab en tant qu'utilisateur: www-data?

32

My LAMP est configuré pour fonctionner au fur user:www-dataet à mesure que tous les fichiers et dossiers sont créés avec ces autorisations.

J'ai configuré crontab en tant qu'utilisateur @ ubuntu.

Donc je fais crontab -eet utilise cette commande:

*/5 * * * * php /var/www/public/voto_m/artisan top >/dev/null 2>&1

Fondamentalement, cette commande crée simplement un fichier cache à l'endroit spécifié (aucun problème avec cela), mais ce fichier cache est créé avec les autorisations utilisateur: utilisateur et non les user:www-dataautorisations.

Comment puis-je faire en sorte qu'il crée par défaut un fichier avec des user:www-dataautorisations?
Je ne peux pas y aller et chownchaque fois que le fichier est recréé.

Merci.

arma
la source
Notez que certains scripts crontab qui s'exécutent en tant que www-data (par exemple pour awstats, ou php5sessionclean) sont situés dans des /etc/cron.*répertoires et ne sont donc pas visibles à travers crontab -e(même lorsque vous spécifiez l'utilisateur www-data ).
Skippy le Grand Gourou

Réponses:

40

Vous pouvez écrire votre entrée dans la crontab système /etc/crontab, qui prend un argument supplémentaire spécifiant l'utilisateur à exécuter en tant que (généralement root, mais peut être www-data).

Votre ligne deviendrait:

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

Ou vous pouvez éditer la crontab de www-data utilisateur avec su:

sudo su -c "crontab -e" www-data
mivk
la source
1
en fait, la deuxième option ne fonctionne pas sur la plupart des versions d'Ubuntu
user123
La deuxième option fonctionne pour moi sur 12.04LTS. Peut-être que ce n'est pas sur les versions ultérieures?
mivk
1
la deuxième option ne fonctionne pas le 14.04
dgoosens
Pour faciliter la gestion, la ligne peut également être mis dans son propre fichier /etc/cron.davec un nom descriptif, par exemple , /etc/cron.d/artisan.
fkraiem
2
Pour la deuxième option, essayez ceci à la placesudo su -c "crontab -e" www-data -s /bin/bash
Lunfel
51

Vous pouvez également exécuter crontab avec l' -uargument pour modifier une crontab pour un utilisateur spécifique:

sudo crontab -u www-data -e
Commandant de code
la source
cela fonctionne le 14.04
dgoosens
3

Pour exécuter un crontab en tant qu'utilisateur www-data, vous pouvez utiliser la commande suivante:

crontab -u www-data -e

Ensuite, vous écrivez une ligne, par exemple pour exécuter un fichier php toutes les 15 minutes:

*/15  *  *  *  * php -f /path_to_cron/cron.php

Lors de sa sauvegarde, l'éditeur vous demandera:

File Name to Write: /tmp/crontab.HMpG7V 

Enregistrez-le là, pas de soucis. crontab -eouvre un fichier dans / tmp à la place de la crontab réelle afin qu'il puisse vérifier les erreurs de votre nouveau crontab et vous empêcher d'écraser votre crontab réel avec ces erreurs. S'il n'y a pas d'erreurs, votre crontab réel sera mis à jour. Si crontab -e vient d'écrire directement sur votre crontab réel, vous risquez de faire exploser l'intégralité de votre crontab.

Pour vérifier que votre cronjob s'exécute, vous pouvez consulter les journaux cron. généralement dans /var/log/cron.log ou en exécutant la commande suivante:

crontab -u www-data -l
Spacebiker
la source
Celui-ci a fonctionné pour moi sur Ubuntu
tristanbailey
Cela a déjà été répondu correctement et de manière plus concise par le commandant de code au-dessus de 4 ans auparavant. Vous avez omis l'utilisation de "sudo". et jeté des informations non demandées concernant le format de la ligne cron.
HörmannHH
@RichieHH, pourquoi devrais-je ajouter le sudo? Qui a dit que l'utilisateur ne s'exécutait pas déjà en tant que root? Quiconque utilise cette commande doit avoir suffisamment de connaissances pour savoir que s'il doit exécuter la commande avec des privilèges devra l'exécuter avec sudo, sinon mieux ne touchez pas .. et vous dites de façon plus concise ...? commandant de code vient de taper la commande mais n'a pas donné plus d'informations
spacebiker
.. si vous êtes aussi intelligent, vous feriez mieux de commencer à donner des réponses au lieu de critiquer le travail des autres, peut-être alors vous commencez à avoir une certaine réputation
Spacebiker
-1

Je voudrais ajouter une autre approche. Comme d'autres personnes l'ont mentionné, Ubuntu (16.04 ici) et www-data crontab ne semblent pas fiables (c'est peut-être une question de sécurité?).

Quoi qu'il en soit, dans notre entreprise, nous aimons avoir tous les cronjobs sur un serveur facilement accessible, pour ne rien manquer. En même temps, nous ne voulons pas tout exécuter (quoi que ce soit vraiment!) En tant que root.

Par conséquent, nous courons

sudo crontab -e 

Comme vous le faites normalement, puis nous spécifions la commande comme

* * * * * /bin/su - www-data -s /bin/bash -c '/path/to/command'

Cela exécutera / path / to / command en tant que www-data tout en conservant le cronjob dans le fichier cronjobs racine (et cela s'exécutera toujours correctement). Il a l'avantage de pouvoir écrire les fichiers journaux en tant que root (pour une sécurité maximale) à l'aide de canaux.

Notez que nous passons notre shell préféré, cela pourrait également être / bin / sh pour un shell plus simple (nous aimons juste les capacités bash complètes). Www-data n'a pas de shell spécifié, vous obtiendrez donc des erreurs sans lui. Normalement, cron exécute les tâches avec / bin / sh uniquement.

Henrik
la source