Impostazione di un lavoro cron che esegue un chmod / chown


9

Vorrei impostare un lavoro cron che ricusivamente fa un chmod / chown su una directory (la directory di dropbox).

Questo funziona quando eseguo i comandi manualmente come:

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

Ho provato a convertirlo in un lavoro cron come questo:

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

Ma non sembra fare il lavoro.

Come fare questo?


incron+ inotifysarebbero soluzioni più pulite :)
franzlorenzon,

Risposte:


9

Vuoi che il tuo script cron cron (modifica eseguendo sudo crontab -e) sia:

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

Supponendo che l'utente sia chiamato somenamee che /home/somename/Dropboxsia il percorso completo della directory di Dropbox. Come utente root, ~ va a /root.


1
Grazie per la chiara risposta! Penso che questo mi mostri alcuni dei collegamenti mancanti che stavo cercando. Lo
proverò

Testato e funziona!
tvgemert,

2
Grande; felice che funzioni. Le lezioni sono (a) non si aspettano che variabili ambientali come quelle $PATHsiano definite equivalenti a quelle di un utente che ha effettuato l'accesso in un cronjob (ad esempio, sul mio linuxbox $ HOME è definito, ma $ PATH è impostato su /usr/bine /binda crontab e $ USER non è definito; quindi in questo caso non è stato necessario specificare /binprima di chmod / chown), (b) evitare sudonegli script (eseguire cron task come rootutente), (c) come utente root $HOMEfarà riferimento a / root non all'utente normale , (d) ~dovrebbe essere evitato negli script cron (di default eseguito come #!/bin/sh.
dr jimbob,

Consiglierei anche di inserire una sceneggiatura su consiglio di David se mai fai qualcosa di più complicato di così; uno script sembra eccessivo per una combinazione di chmod / chown. Tuttavia, se inizi a fare domanda per Dropbox o altre directory di altri utenti o decidi di essere eseguito solo su file modificati di recente (ad es., Risultato di find), ecc., Allora ha senso inserire uno script.
dr jimbob,

16

sudonon dovrebbe quasi mai essere utilizzato nelle attività pianificate. Si aspetta di essere in grado di parlare con un terminale e richiede flag specifici per evitare di provare a farlo.

Crea il tuo cron job come root (in /etc/crontab- Nota che il formato di questo file è leggermente diverso:) invece. Questo ha anche il vantaggio di lavorare su sistemi in cui non è installato.minute hour mday month wdayusercommand
sudo


Grazie! Ho creato questo, ma non sono ancora sicuro. Non ho ottenuto il risultato atteso: 55 * * * * root chown -R somename ~/Dropbox
tvgemert,

3
somenamepotrebbe essere ovunque; è un percorso relativo. In secondo luogo, ~è compreso solo dalla shell; usare $HOME. Usa un comando come questo: chown -R /some/path/somename $HOME/Dropbox(utilizzerà rootla home directory di ...)
Mei,

@David: somenamenon è un percorso, ma il nome utente (e dovrebbe contenere anche il nome del gruppo somename:somegroup
:)

5
@tvgemert Ciò che David ha detto sopra (e nella sua risposta) riguardo a percorsi / percorsi relativi / percorsi simbolici ( ~) è CRITICAMENTE IMPORTANTE - Per favore, dedica un po 'di tempo alle pagine man cron e crontab e assicurati di capire cosa sta succedendo (in caso di dubbio , crea un lavoro cron che fa echo "what you want to do" > /tmp/what-i-would-rune guarda i risultati per essere sicuro che siano sani - MOLTE meno possibilità di distruggere l'universo.)
voretaq7

Grazie per i suggerimenti utili, mi ha già dato ulteriori informazioni!
tvgemert,

6

Due problemi:

1) I percorsi normalmente non sono impostati in cron nello stesso modo in cui sono quando effettui il login. Prova / usr / bin / sudo / bin / chown ... (o qualunque sia la strada giusta per quei programmi sul tuo sistema).

2) sudo richiede normalmente la tua password, oppure potrebbe non essere felice di correre in modo non interattivo. Suggerisco di inserire i comandi nel crontab di root senza sudo, quindi i comandi vengono eseguiti come root.


5

Ci sono più problemi con il tuo crontab:

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

I problemi:

  • sudonon dovrebbe essere usato qui; richiede input da terminale
  • chowndovrebbe essere completamente specificato (cioè, /bin/chown)
  • USERpoiché una variabile effettiva potrebbe non esistere; alcuni sistemi usanoLOGNAME
  • ~(tilde) sarà riconosciuto solo da una shell - un nudo chownnon lo capirà
  • la specifica di HOME nel crontab di root va a casa di root

Penso che lo avrei effettivamente scritto:

#!/bin/bash

# FILE: /usr/local/bin/myscript

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

( evalÈ necessario convertire ~$1in ~user poi in /home/user.)

Esegui questo script dal crontab di root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.