Configurer un travail cron qui fait un chmod / chown

9

Je voudrais mettre en place un travail cron qui fait récursivement un chmod / chown sur un répertoire (le répertoire dropbox).

Cela fonctionne lorsque j'exécute les commandes manuellement comme:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

J'ai essayé de le convertir en un travail cron comme celui-ci:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

Mais cela ne semble pas faire l'affaire.

Comment faire ça?

tvgemert
la source
incron+ inotifyserait des solutions plus propres :)
franzlorenzon

Réponses:

9

Vous voulez que votre script cron racine (éditer en exécutant sudo crontab -e) soit:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

En supposant que l'utilisateur est nommé somenameet qu'il /home/somename/Dropboxs'agit du chemin complet de votre répertoire Dropbox. En tant qu'utilisateur root, ~ va à /root.

dr jimbob
la source
1
Merci pour la réponse claire! Je pense que cela me montre certains des liens manquants que je cherchais. Je vais le tester dès demain :)
tvgemert
Je l'ai testé et ça marche!
tvgemert
2
Génial; heureux son fonctionnement. Les leçons sont (a) ne vous attendez pas à ce que les variables d'environnement $PATHsoient définies comme équivalentes à celles d'un utilisateur connecté dans un cronjob (par exemple, sur ma linuxbox $ HOME est défini, mais $ PATH est défini vers /usr/binet /bindepuis crontab et $ USER n'est pas défini; dans ce cas, vous n'avez pas besoin de spécifier /binavant chmod / chown), (b) éviter sudodans les scripts (exécuter la tâche cron en tant rootqu'utilisateur), (c) en tant qu'utilisateur root $HOMEfera référence à / root n'est pas votre utilisateur normal , (d) ~devrait être évité dans les scripts cron (par défaut exécuté comme #!/bin/sh.
dr jimbob
Je recommanderais également de mettre un script selon les conseils de David si vous faites quelque chose de plus compliqué que cela; un script semble exagéré pour une combinaison d'un chmod / chown. Cependant, si vous commencez à appliquer aux Dropbox d'autres utilisateurs ou à d'autres répertoires ou décidez de ne s'exécuter que sur des fichiers récemment modifiés (par exemple, résultat de find), etc., il est logique de mettre un script.
dr jimbob
16

sudone devrait presque jamais être utilisé dans des tâches planifiées. Il s'attend à pouvoir parler à un terminal et nécessite des indicateurs spécifiques pour éviter d'essayer de le faire.

Créez votre travail cron en tant que root (dans /etc/crontab- Notez que le format de ce fichier est légèrement différent :) à la place. Cela a également l'avantage de travailler sur des systèmes où n'est pas installé.minute hour mday month wdayusercommand
sudo

voretaq7
la source
Merci! J'ai créé cela, mais je n'en suis toujours pas sûr. Je n'ai pas obtenu le résultat escompté: 55 * * * * root chown -R somename ~/Dropbox
tvgemert
3
somenamepourrait être n'importe où; c'est un chemin relatif. Deuxièmement, ~n'est compris que par la coquille; utiliser $HOME. Utilisez une commande comme celle-ci: chown -R /some/path/somename $HOME/Dropbox(ceci utilisera rootle répertoire personnel de ...)
Mei
@David: somenamen'est pas un chemin, mais le nom d'utilisateur (et doit également contenir le nom du groupe somename:somegroup
:)
5
@tvgemert Ce que David a dit ci-dessus (et dans sa réponse) concernant les chemins / chemins relatifs / chemins symboliques ( ~) est CRITIQUEMENT IMPORTANT - Veuillez passer du temps avec les pages de manuel cron et crontab et assurez-vous de comprendre ce qui se passe (en cas de doute , créez un travail cron qui fonctionne echo "what you want to do" > /tmp/what-i-would-runet regardez les résultats pour vous assurer qu'ils sont sains d'esprit - BEAUCOUP moins de chances de détruire l'univers.)
voretaq7
Merci pour les conseils utiles, m'a déjà donné plus d'informations!
tvgemert
6

Deux problèmes:

1) Les chemins d'accès ne sont normalement pas configurés dans cron de la même manière que lorsque vous vous connectez. Essayez / usr / bin / sudo / bin / chown ... (ou quels que soient les bons chemins d'accès à ces programmes sur votre système).

2) sudo vous demande normalement votre mot de passe, ou peut ne pas être content de fonctionner de manière non interactive. Je vous suggère de mettre les commandes dans la crontab de root sans le sudo à la place, puis les commandes s'exécutent en tant que root.

pjc50
la source
5

Il y a plusieurs problèmes avec votre crontab:

10 * * * sudo chown -R $USER ~/Dropbox

Les problèmes:

  • sudone doit pas être utilisé ici; il nécessite une entrée de terminal
  • chowndevrait être entièrement spécifié (c.-à-d. /bin/chown)
  • USERcomme une variable réelle peut ne pas exister; certains systèmes utilisentLOGNAME
  • ~(tilde) ne sera reconnu que par un shell - un nu chownne le comprendra pas
  • spécifier HOME dans le crontab de root va à la maison de root

Je pense que je le rédigerais en fait:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

(Le evalest nécessaire pour convertir ~$1en ~user puis en /home/user.)

Exécutez ce script à partir de la crontab de root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser
Mei
la source
0

Comme alternative, vous pourriez être en mesure d' activer le support ACL et d'utiliser setfacl pour obtenir le même résultat / similaire.

Ryan D
la source