Konfigurowanie zadania cron, które wykonuje chmod / chown

9

Chciałbym skonfigurować zadanie crona, które rekusywnie wykonuje chmod / chown w katalogu (katalog dropbox).

Działa to, gdy wykonuję polecenia ręcznie, takie jak:

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

Próbowałem przekonwertować go na zadanie CRON takie:

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

Ale to chyba nie działa.

Jak to zrobić?

tvgemert
źródło
incron+ inotifybyłyby czystsze rozwiązania :)
franzlorenzon

Odpowiedzi:

9

Chcesz, aby Twój główny skrypt cron (edycja przez uruchomienie sudo crontab -e) był:

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

Zakładając, że użytkownik jest nazwany somenamei że /home/somename/Dropboxjest to pełna ścieżka do katalogu Dropbox. Jako użytkownik root ~ przechodzi do /root.

dr jimbob
źródło
1
Dzięki za jasną odpowiedź! Myślę, że to pokazuje mi brakujące linki, których szukałem. Najpierw przetestuję to jutro :)
tvgemert
Przetestowałem to i działa!
tvgemert
2
Świetny; cieszę się, że działa. Lekcje (a) nie oczekują, że zmienne środowiskowe, takie jak $PATHzdefiniowane, będą równoważne z danymi zalogowanego użytkownika w kronice (np. Na moim Linuxie zdefiniowano $ HOME, ale $ PATH jest ustawione na /usr/bini /binod crontab i $ USER nie jest zdefiniowany; więc w tym przypadku nie trzeba było określać /binprzed chmod / chown), (b) unikać sudow skryptach (uruchamiaj zadanie cron jako rootużytkownik), (c) jako użytkownik root $HOMEbędzie odnosił się do / root, a nie do zwykłego użytkownika , (d) ~należy unikać w skryptach cron (domyślnie uruchamiany jako #!/bin/sh.
dr jimbob
Poleciłbym również umieścić skrypt zgodnie z radą Davida, jeśli kiedykolwiek zrobisz coś bardziej skomplikowanego niż to; skrypt wydaje się przesadny dla kombinacji chmod / chown. Jeśli jednak zaczniesz aplikować do Dropbox lub innych katalogów innych użytkowników lub zdecydujesz się uruchamiać tylko na ostatnio zmienionych plikach (np. Wynik find) itp., To nie ma sensu umieszczać skryptu.
dr jimbob
16

sudoprawie nigdy nie powinien być stosowany w zaplanowanych zadaniach. Oczekuje, że będzie w stanie rozmawiać z terminalem i wymaga określonych flag, aby uniknąć próby.

Utwórz zadanie crona jako root (w /etc/crontab- Zauważ, że format tego pliku jest nieco inny :). Ma to również tę zaletę, że działa na systemach, na których nie jest zainstalowany.minute hour mday month wdayusercommand
sudo

voretaq7
źródło
Dzięki! Stworzyłem to, ale nadal nie jestem tego pewien. Nie uzyskałem oczekiwanego rezultatu: 55 * * * * root chown -R somename ~/Dropbox
tvgemert
3
somenamemoże być gdziekolwiek; jest to ścieżka względna. Po drugie, ~jest rozumiany tylko przez powłokę; użyć $HOME. Użyj następującego polecenia: chown -R /some/path/somename $HOME/Dropbox(użyje rootkatalogu domowego ...)
Mei
@David: somenamenie jest ścieżką, ale nazwa użytkownika (i powinna również zawierać nazwę grupy somename:somegroup
:)
5
@tvgemert To, co David powiedział powyżej (i w swojej odpowiedzi) na temat ścieżek / ścieżek względnych / ścieżek symbolicznych ( ~) jest KRYTYCZNIE WAŻNE - Proszę poświęcić trochę czasu na stronach podręcznika użytkownika cron i crontab i upewnij się, że rozumiesz, co się dzieje (w razie wątpliwości , stwórz pracę crona, która to robi echo "what you want to do" > /tmp/what-i-would-runi spójrz na wyniki, aby upewnić się, że są rozsądne - DUŻO mniejsze szanse na zniszczenie wszechświata.)
voretaq7
Dziękuję za użyteczne wskazówki, dał mi więcej wglądu!
tvgemert
6

Dwie kwestie:

1) Ścieżki zwykle nie są konfigurowane w cronie w taki sam sposób, jak podczas logowania. Spróbuj / usr / bin / sudo / bin / chown ... (lub jakąkolwiek inną właściwą ścieżkę do tych programów w systemie).

2) sudo zwykle prosi o podanie hasła lub może nie być zadowolony z nieinteraktywnego działania. Sugeruję, aby zamiast tego umieścić polecenia w crontab roota bez sudo, a następnie polecenia będą działać jako root.

pjc50
źródło
5

Istnieje wiele problemów z twoim crontabem:

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

Problemy:

  • sudonie powinien być tutaj stosowany; wymaga wejścia na terminal
  • chownpowinien być w pełni określony (tj. /bin/chown)
  • USERponieważ rzeczywista zmienna może nie istnieć; niektóre systemy używająLOGNAME
  • ~(tylda) zostanie rozpoznana tylko przez powłokę - goły chownnie zrozumie
  • określenie HOME w crontab roota przechodzi do home roota

Myślę, że tak naprawdę napisałbym to:

#!/bin/bash

# FILE: /usr/local/bin/myscript

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

(Konieczne evaljest przekonwertowanie ~$1na, ~user a następnie na /home/user.)

Uruchom ten skrypt z crontab roota:

# root's crontab
10 * * * /usr/local/bin/myscript someuser
Mei
źródło