Ubuntuxer
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Hi Leute, Ich hab eine Frage zu der Cron Erweiterung Anacron. Kann man einen anacrontab auch ohne sudo Rechte anlegen? Wenn ich den Befehl
anacron -t ~/Datei ausführe, wird die standartmäßige anacrontab in /etc/anacrontab nicht mehr beachtet, oder? Hier steht nämlich:
Read tasks from file instead of from /etc/anacrontab.
Meine Frage wäre also wie kann man ohne die Standartsachen zu löschen einen neuen anacrontab am besten ohne sudo anlegen? Ich hoffe ihr könnt mir helfen 😉 Ubuntuxer Moderiert von ditsch: Ein Fragezeichen im Titel reicht auch.
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
|
adun
Anmeldungsdatum: 29. März 2005
Beiträge: 8606
|
Wem die gehört oder welche Rechte die Datei hat ist egal (solange sie gelesen werden kann). Du musst aber nicht einfach anacron aufrufen, sondern in /etc/init.d/anacron die Zeile start-stop-daemon --start --exec /usr/sbin/anacron -- -s bearbeiten.
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Ich verstehe nicht genau, was du meinst die Datei /etc/init.d/anacron kann ich nur als sudo bearbeiten. Was genau muss ich den in der Zeile verändern?
|
DrScott
Ehemalige
Anmeldungsdatum: 7. Juli 2005
Beiträge: 6018
Wohnort: Nürnberg
|
Was willst Du den genau? Den ganz normalen Anacron-Job dazu bewegen, eine andere Steuerdatei zu verwenden? Die bisherige Steuerdatei für (bestimmte) Benutzer editierbar machen? Einen weiteren Anacron-Job mit separater Steuerdatei starten? P.S.: adun meinte, dass Du ganz am Ende der zitierten Zeile eben "-t /absoluter/pfad/zur/neuen/Steuerdatei" anhängst. Beachte bitte, dass Du Dir dadurch - je nach Rechtevektor dieser Steuerdatei - ein mögliches Sicherheitsloch aufhalst: Die dort angegebenen Befehle werden mit Rootrechten ausgeführt. Vielleicht erzählst Du besser, was Du eigentlich vorhast?
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Ich programmiere gerade ein Programm in Python, welches täglich bzw. wöchentlich überprüfen soll, ob eine Datei auf einem Server geändert wurde. Ich möchte über Python einfach einen neuen Anacronjob anlegen. Am einfachsten wäre es wahrscheinlich in die Ordner /etc/cron.daily bzw. /etc/cron.weekly eine ausführbare Datei zu schreiben, aber die Ordner sind nur als sudo beschreibbar. Das Problem hierbei ist das ich bisher keine sinnvolle Lösung gefunden habe mit Python eine Datei als sudo zu beschreiben, ohne das ganze Programm als sudo zu starten. Einzige Notlösung mit os.system('gksu Pythondatei') eine Pythondatei als root öffnen, welche dann in die Ordner schreiben kann. (subprocess und pexpect haben beide in Verbindung mit gksu nicht funktioniert) Deshalb würde ich eigentlich lieber, wenn es möglich ist ein Anacron-Job nicht als root anlegen. Bei cronjob war dies auch möglich. Die Datei /etc/init.d/anacron zu bearbeiten hilft mir leider auch nicht wirklich weiter, da ich auch dort sudo brauch. ☹
|
Maduser
Anmeldungsdatum: 3. Mai 2005
Beiträge: 1238
|
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Eigentlich will er nur den Job selbst als normaler Nutzer ausführen, oder?
I don't want to execute those jobs as root, but as my 'regular' user. Is there a way to do this?
Vielleicht kann man aber trotzdem diese Lösung verwenden. Ich verstehe aber nicht was mit spooldir gemeint ist, da muss ich nichts verändern, oder?
|
Lutki
Anmeldungsdatum: 17. Juni 2006
Beiträge: 372
|
Ubuntuxer hat geschrieben: Ich verstehe aber nicht was mit spooldir gemeint ist, da muss ich nichts verändern, oder?
Das spooldir ist das Verzeichnis in dem die timestamps von anacron abgelegt werden. Hier mal ein kleines Beispiel. Verzeichnis für anacron-Dateien anlegen: mkdir $HOME/.anacron 2 Verzeichnisse zum Testen anlegen: mkdir $HOME/.anacron/cron.daily mkdir $HOME/.anacron/cron.weekly Spoolverzeichnis anlegen: mkdir $HOME/.anacron/timestamps Die Datei $HOME/.anacron/anacrontab mit folgendem Inhalt anlegen: # See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# These replace cron's entries
1 5 user.daily nice run-parts --report $HOME/.anacron/cron.daily
7 10 user.weekly nice run-parts --report $HOME/.anacron/cron.weekly
# eof Statt des Befehls 'nice run-parts --report $HOME/.anacron/cron.daily' kannst du natürlich auch einen anderen Befehl verwenden; aber so brauchst du deine Skripte nur in cron.daily oder cron.weekly ablegen. Das ganze kannst du mit folgendem Befehl starten: /usr/sbin/anacron -t ${HOME}/.anacron/anacrontab -S ${HOME}/.anacron/timestamps &> ${HOME}/.anacron/anacron.log (Hier ist noch eine Logdatei für eventuelle Fehlermeldungen angehangen; auf diese könnte man verzichten oder man läßt sie regelmäßig rotieren.) Nach 5 Minuten wird 'nice run-parts --report $HOME/.anacron/cron.daily' ausgeführt. Der Timestamp in $HOME/.anacron/timestamps/user.daily wird angelegt bzw. geändert. Nach 10 Minuten wird 'nice run-parts --report $HOME/.anacron/cron.weekly' ausgeführt. Der Timestamp in $HOME/.anacron/timestamps/user.weekly wird angelegt bzw. geändert. anacron sollte sich automatisch beenden, falls es nichts mehr zu tun gibt. Anstoßen kannst du alles über einen normalen (User-) cronjob. MFG
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
@Lutki vielen Dank für diese ausführlich Erklärung. ☺ Ich habe mich aber jetzt entschlossen, da das anlegen eines anacronjobs als User wie du beschrieben hast sehr aufwendig ist, doch einen anacronjob als sudo anlegen und den Umweg über eine andere Datei, welche ich als sudo starten muss, in Kauf zu nehmen.
|
DrScott
Ehemalige
Anmeldungsdatum: 7. Juli 2005
Beiträge: 6018
Wohnort: Nürnberg
|
Du kannst Dich auch mit der Datei /etc/sudoers ( sudo/Konfiguration ) auseinandersetzen: Dort kann eingestellt werden, dass ganz bestimmte Befehle von ganz bestimmten Anwendern zwar mit "sudo" aber ohne Angabe eines Passworts ausgeführt werden dürfen. Bedenke, dass Befehle in der /etc/anacrontab als "root" ausgeführt werden! Vielleicht wäre es besser, in der /etc/anacrontab ein Shellskript fest einzutragen, welches die eigentlichen Kommandos aus einer anderen Konfigurationsdatei ließt bzw. ein anderes Shellskript ausführt (z.b. $HOME/.runme), und zwar nachdem es zu den Rechten des entsprechenden Users gewechselt hat (Stichwort "su", siehe "man su").
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Vielleicht wäre es besser, in der /etc/anacrontab ein Shellskript fest einzutragen, welches die eigentlichen Kommandos aus einer anderen Konfigurationsdatei ließt bzw. ein anderes Shellskript ausführt (z.b. $HOME/.runme), und zwar nachdem es zu den Rechten des entsprechenden Users gewechselt hat (Stichwort "su", siehe "man su").
Ich glaub es ist einfacherer in die Ordner cron.daily, cron.weekly, ein shell script einzutragen welches su aufrüft und dann die Python Datei startet die sich um das Update kümmern soll, aber danke für den Hinweis mit su. Meine Frage wäre aber noch wie ich den User rausbekomme, der das Programm ausgeführt hat.
|
DrScott
Ehemalige
Anmeldungsdatum: 7. Juli 2005
Beiträge: 6018
Wohnort: Nürnberg
|
Ubuntuxer hat geschrieben: Meine Frage wäre aber noch wie ich den User rausbekomme, der das Programm ausgeführt hat.
"Das Programm" legt eine Datei "$HOME/.itwasme" ab. Der Cronjob klappert dann die Userverzeichnisse ab, und findet dadurch jene User, die "das Programm" gestartet haben... Konkreter kann dann der job noch die Datei $HOME_OF_USER/.itwasme löschen. Es ist aber eigentlich nicht schön, wenn ein root-Prozess Dateien im USER-Bereich löscht. Besser, aber aufwendiger: Der CronJob hat eine Referenzdatei (vielleicht irgendwo unter /var/spool/...?). Er prüft, welche Datei $HOME/.itwasme ein neueres Modifikationsdatum hat, als diese... Zum Schluß setzt der Cronjob das Datum der Referenzdatei auf den aktuellen Zeitpunkt... Hmm, damit das ganze bei Backups nicht aus dem Tritt kommt, sollte vielleicht nicht der Zeitstempel der $HOME/.itwasme genommen werden. Stattdessen könnte festgelegt sein, daß in der Datei ein Zeitstempel gespeichert ist... Über die "race condition" sehen wir jetzt mal drüber hinweg.... 😉 Es liegt letzlich an deiner Aufgabe, welchen Aufwand du betreiben willst/mußt.
|
Ubuntuxer
(Themenstarter)
Anmeldungsdatum: 16. September 2007
Beiträge: 429
|
Es liegt letzlich an deiner Aufgabe, welchen Aufwand du betreiben willst/mußt.
Ich will einfach möglichst wenig Aufwand betreiben, da diese Funktion eher eine optionale Funktion in dem Programm ist. Ich habe eine andere Möglichkeit gefunden den User, der das Programm ausführt zu ermitteln. einfach:
os.path.split(os.path.expanduser('~'))[1] Ist diese Möglichkeit genauso sicher wie die Methode, die du beschrieben hast? Bei mir funktioniert die natürlich, aber ich habe auch nur einen User im System.
|
DrScott
Ehemalige
Anmeldungsdatum: 7. Juli 2005
Beiträge: 6018
Wohnort: Nürnberg
|
Ubuntuxer hat geschrieben: Bei mir funktioniert die natürlich, aber ich habe auch nur einen User im System.
Damit kannst Du ja nur den User ermitteln, _während_ er gerade das Programm ausführt. Ich habe dich da wohl bisher falsch verstanden. Ich ging davon aus, das der User irgendwann Programm XYZ aufruft. Dieses Programm bestimmt dann, was später von einem Cronjob ausgeführt werden soll. Dieser Cronjob läuft aber als "root". Ich verstehe jetzt nicht, wie dieser Job per "os.path.split(os.path.expanduser('~'))[1]" den Namen des "eigentlichen" Users ermitteln will. Abgesehen davon, dass der Befehl in diesem Szenario ein IndexError liefert würde, wäre das Ergebnis sonst ja immer "root". Wie auch immer: Der Befehl geht davon aus, dass Benutzerverzeichnisse immer /home/<username> lauten. Das ist vielleicht meistens so, aber es ist nicht festgelegt. Die häufigste Ausnahme ist wohl "/root". Benutzerverzeichnisse dürfen aber durchaus auch in tieferen Verzeichnisebenen liegen, wie z.b. "/home/extern/<username>". Das ist eigentlich frei wählbar. Besser wäre also os.path.split(os.path.expanduser('~'))[-1] . Aber auch das ist nicht perfekt, da nichteinmal festgelegt ist, dass das Homeverzeichnis selbst so heißen muss wie der User. "herbert" könnte also durchaus das Home "/home/herberthome" haben. In diesem Fall würde "dein" Kommando versagen. Du könntest auch folgendes versuchen:
print pwd.getpwuid(os.getuid())
|