Einrichten eines Cron-Jobs, der einen Chmod / Chown ausführt

9

Ich möchte einen Cron-Job einrichten, der rekusiv ein chmod / chown für ein Verzeichnis (das Dropbox-Verzeichnis) ausführt.

Dies funktioniert, wenn ich die Befehle manuell ausführe wie:

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

Ich habe versucht, es in einen Cron-Job wie diesen umzuwandeln:

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

Aber es scheint nicht den Job zu machen.

Wie macht man das?

tvgemert
quelle
incron+ inotifywäre sauberere Lösungen :)
Franzlorenzon

Antworten:

9

Sie möchten, dass Ihr Root-Cron-Skript (durch Ausführen bearbeiten sudo crontab -e) wie folgt lautet :

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

Angenommen, der Benutzer heißt somenameund das /home/somename/Dropboxist der vollständige Pfad Ihres Dropbox-Verzeichnisses. Als Root-Benutzer geht ~ zu /root.

Dr. Jimbob
quelle
1
Danke für die klare Antwort! Ich denke, das zeigt mir einige der fehlenden Links, nach denen ich gesucht habe. Ich werde es morgen als erstes testen :)
tvgemert
Getestet und es funktioniert!
tvgemert
2
Toll; Ich bin froh, dass es funktioniert. Die Lektionen lauten: (a) Erwarten Sie nicht, dass Umgebungsvariablen $PATHdefiniert werden, die denen eines angemeldeten Benutzers in einem Cronjob entsprechen (z. B. ist auf meiner Linuxbox $ HOME definiert, aber $ PATH wird auf /usr/binund /binvon crontab und $ USER gesetzt ist nicht definiert; in diesem Fall mussten Sie also nicht /binvor chmod / chown angeben ), (b) sudoin Skripten vermeiden (cron task als rootBenutzer ausführen ), (c) da sich der Root-Benutzer $HOMEauf / root bezieht, nicht auf Ihren normalen Benutzer , (d) ~sollte in Cron-Skripten vermieden werden (standardmäßig ausgeführt als #!/bin/sh.
Dr. Jimbob
Ich würde auch empfehlen, ein Skript gemäß Davids Rat einzufügen, wenn Sie jemals etwas Komplizierteres tun. Ein Skript scheint für eine Kombination aus chmod / chown übertrieben. Wenn Sie sich jedoch auf Dropboxen oder andere Verzeichnisse anderer Benutzer anwenden oder sich dafür entscheiden, nur kürzlich geänderte Dateien (z. B. Ergebnis von find) usw. auszuführen , ist es sinnvoll, ein Skript einzufügen .
Dr. Jimbob
16

sudosollte fast nie in geplanten Aufgaben verwendet werden. Es erwartet, mit einem Terminal kommunizieren zu können, und erfordert bestimmte Flags, um dies nicht zu versuchen.

Erstellen Sie stattdessen Ihren Cron-Job als Root (in /etc/crontab- Beachten Sie, dass das Format dieser Datei etwas anders ist :). Dies hat auch den Vorteil, dass auf Systemen gearbeitet wird, auf denen keine installiert ist.minute hour mday month wdayusercommand
sudo

voretaq7
quelle
Vielen Dank! Ich habe das erstellt, bin mir aber immer noch nicht sicher. Ich habe nicht das erwartete Ergebnis erhalten: 55 * * * * root chown -R somename ~/Dropbox
tvgemert
3
somenamekönnte überall sein; es ist ein relativer Weg. Zweitens ~wird nur von der Schale verstanden; verwenden $HOME. Verwenden Sie einen Befehl wie diesen: chown -R /some/path/somename $HOME/Dropbox(dies wird rootdas Home-Verzeichnis verwenden ...)
Mei
@ David: somenameist kein Pfad, aber der Benutzername (und sollte auch den Gruppennamen enthalten somename:somegroup
:)
5
@tvgemert Was David oben (und in seiner Antwort) zu Pfaden / relativen Pfaden / symbolischen Pfaden ( ~) gesagt hat, ist KRITISCH WICHTIG - Bitte verbringen Sie einige Zeit mit den Manpages von cron und crontab und stellen Sie sicher, dass Sie verstehen, was los ist (im Zweifelsfall) , erstellen Sie einen Cron-Job, der dies tut, echo "what you want to do" > /tmp/what-i-would-runund sehen Sie sich die Ergebnisse an, um sicherzugehen, dass sie vernünftig sind - VIEL weniger Chancen, das Universum zu zerstören.)
voretaq7
Vielen Dank für die nützlichen Tipps, gab mir schon mehr Einblick!
tvgemert
6

Zwei Probleme:

1) Pfade werden in cron normalerweise nicht so eingerichtet wie beim Anmelden. Versuchen Sie / usr / bin / sudo / bin / chown ... (oder was auch immer die richtigen Pfade zu diesen Programmen auf Ihrem System sind).

2) sudo fragt normalerweise nach Ihrem Passwort oder ist ansonsten möglicherweise nicht zufrieden damit, nicht interaktiv zu laufen. Ich schlage vor, Sie setzen die Befehle stattdessen ohne sudo in die crontab von root, dann werden die Befehle als root ausgeführt.

pjc50
quelle
5

Es gibt mehrere Probleme mit Ihrer Crontab:

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

Die Probleme:

  • sudosollte hier nicht verwendet werden; es erfordert Klemmeneingang
  • chownsollte vollständig spezifiziert sein (dh /bin/chown)
  • USERals tatsächliche Variable kann nicht existieren; Einige Systeme verwendenLOGNAME
  • ~(Tilde) wird nur von einer Shell erkannt - ein Bare chownwird es nicht verstehen
  • Die Angabe von HOME in der crontab von root geht zu root nach Hause

Ich denke, ich würde es tatsächlich schreiben:

#!/bin/bash

# FILE: /usr/local/bin/myscript

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

(Das evalist zu konvertieren benötigt , ~$1um ~user dann zu /home/user.)

Führen Sie dieses Skript von Roots Crontab aus:

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