Cronjob per CGI starten
speedy
- webserver
Hallo Forum,
ich hab mal wieder ein Problemchen... weis jemand ob ich auf einem LinuxUnix-Server einen cronjob per Perlskript (und das CGI) starten kann. Das muesste doch irgendwie mit einem Systemaufruf funktionieren, oder?
Viele Gruesse
speedy
ich hab mal wieder ein Problemchen... weis jemand ob ich auf einem LinuxUnix-Server einen cronjob per Perlskript (und das CGI) starten kann. Das muesste doch irgendwie mit einem Systemaufruf funktionieren, oder?
Ein cronjob zeichnet sich dadurch aus, dass vom cron-Mechanismus ausgeführt wird. Wenn ein Prozess durch ein CGI-Skript gestartet wird, kann man den nicht mehr als cronjob bezeichnen.
Peter
Hi,
weis jemand ob ich auf einem LinuxUnix-Server einen cronjob per Perlskript starten kann.
kommt darauf an, was Du unter "Cron-Job" und "Starten" meinst.
Wenn Du meinst, daß Du einen Job starten willst, der uhrzeitgesteuert ablaufen soll, dann ist das ein Widerspruch in sich selbst - denn entweder willst Du den Zeitpunkt explizit berechnen (in dem Moment, in dem Dein CGI-Programm ausgeführt wird) oder implizit (in dem Moment, der über Cron vodefiniert war).
Was Du aber tun kannst, ist, via CGI/Perl den Eintrag des Jobs in die Cron-Tabelle vorzunehmen. Dafür gibt es das Kommando "crontab", welches Du natürlich auch via Perl aufrufen kannst.
mfG - Michael
Hi,
Was Du aber tun kannst, ist, via CGI/Perl den Eintrag des Jobs in die Cron-Tabelle vorzunehmen. Dafür gibt es das Kommando "crontab", welches Du natürlich auch via Perl aufrufen kannst.
ich hab mich nicht richtig ausgedrueckt. Das war‚s was ich meine!
Ich kenne bis jetzt nur den Aufruf mit crontab -e um dann den Eintrag mit dem Standardeditor vorzunehmen.
Im Hilfetext von crontab hab ich das hier gefunden:
crontab [-u user] file
Muss ich dann eine Datei mit dem Job anlegen und diese hier angeben? Und wie siehts mit den Rechten aus? Das Skript laeuft ja mit den Rechten des http-Server (weis nicht genau, aber auf keinen Fall mit meinen Rechten, oder doch?). Ich denke, dafuer ist der Parameter "user" da, aber wie uebergeb ich dem Username und Passwort?
Tja, Fragen ueber Fragen...
Dankbar fuer Eure Hilfe
speedy
Hi Speedy!
Muss ich dann eine Datei mit dem Job anlegen und diese hier angeben?
mit 'crontab dein_cron_job_file.txt' kannst Du einen Jon anlegen. In 'dein_cron_job_file.txt' steht der Job drin, als Beispiel:
0 6 * * * /local/pub/cgi-bin/script.pl >/dev/null
Dann wird unter /var/spool/cron/crontabs eine Datei mit dem Job angelegt und cron über den neuen Job informiert.
Und wie siehts mit den Rechten aus? Das Skript laeuft ja mit den Rechten des
http-Server (weis nicht genau, aber auf keinen Fall mit meinen Rechten, oder doch?).
Genau das ist das Problem. Hat der http-Server das Recht, eine CronJob einzurichten?
Wenn die Datei /etc/cron.d/cron.allow existiert und der http-Server dort nicht drin steht, hast Du schlechte Karten. Und wenn der Server in /etc/cron.d/cron.deny drin steht auch.
Ich denke, dafuer ist der Parameter "user" da, aber wie uebergeb ich dem Username und Passwort?
<cite aus man crontab>
..Only a super-user can specify a username...
</cite>
Unter welcher User-Id Deine Scripts laufen, kannst Du ermitteln, wenn Du ein Script das Kommando 'id' ausführen lasst und Dir die Ausgabe an den Browser schicken lässt. Ich habe mal ein Script geschrieben, mit dem man sowas kann, ich schicke es Dir per mail. Ich kenne Server, auf denen die Scripts unter der ID des Eigetümer laufen. Andere lassen die Scripts unter der ID des Servers laufen.
Viel Erfolg beim experimentieren
Gruß Frank
Hi Frank,
0 6 * * * /local/pub/cgi-bin/script.pl >/dev/null
Also
Dann wird unter /var/spool/cron/crontabs eine Datei mit dem Job angelegt und cron über den neuen Job informiert.
Und wie siehts mit den Rechten aus? Das Skript laeuft ja mit den Rechten des
http-Server (weis nicht genau, aber auf keinen Fall mit meinen Rechten, oder doch?).
Genau das ist das Problem. Hat der http-Server das Recht, eine CronJob einzurichten?
Wenn die Datei /etc/cron.d/cron.allow existiert und der http-Server dort nicht drin steht, hast Du schlechte Karten. Und wenn der Server in /etc/cron.d/cron.deny drin steht auch.Ich denke, dafuer ist der Parameter "user" da, aber wie uebergeb ich dem Username und Passwort?
<cite aus man crontab>
..Only a super-user can specify a username...
</cite>Unter welcher User-Id Deine Scripts laufen, kannst Du ermitteln, wenn Du ein Script das Kommando 'id' ausführen lasst und Dir die Ausgabe an den Browser schicken lässt. Ich habe mal ein Script geschrieben, mit dem man sowas kann, ich schicke es Dir per mail. Ich kenne Server, auf denen die Scripts unter der ID des Eigetümer laufen. Andere lassen die Scripts unter der ID des Servers laufen.
Viel Erfolg beim experimentieren
Gruß Frank
Hi Frank,
0 6 * * * /local/pub/cgi-bin/script.pl >/dev/null
danke erstmal fuer die Antwort. Damit wir uns nicht missverstehen: ich will nicht mein CGI-Skript per Cronjob starten, sondern ein anderes, aber das spielt ja keine Rolle.
Dann wird unter /var/spool/cron/crontabs eine Datei mit dem Job angelegt und cron über den neuen Job informiert.
Ok. Das hab ich begriffen.
Viel Erfolg beim experimentieren
Danke, aber eine Frage haette ich dann doch noch: Gibt es nicht eine Moeglichkeit, den User waehrend des Ablaufs des CGI-Skriptes zu wechseln, dann den Cronjob einzurichten und wieder abzumelden?
Viele Gruesse und danke
speedy
PS: execute.pl hab ich bekommen und werd sehen, was ich damit anfangen kann
Hi,
Gibt es nicht eine Moeglichkeit, den User waehrend des Ablaufs des CGI-Skriptes zu wechseln, dann den Cronjob einzurichten und wieder abzumelden?
für ein Programm: Kaum.
Das Problem ist u. a., daß die üblichen Mechanismen zum Wechseln einer Benutzerkennung eine Dialogeingabe (Passwort) fordern (und damit meine ich nicht stdin, sondern wirklich physikalisch Tastatur). Das zu emulieren kriegt Dein Programm nicht hin.
Statt dessen gibt es unter UNIX generell die Möglichkeit, mit dem s-Bit zu arbeiten.
Wenn Du ein Programm (Vorsicht! Dies ist nicht identisch mit 'Perl-Skript'!) hast, welches einer bestimmten Benutzerkennung gehört (chown) und ein bestimmtes Bit gesetzt hat (chmod +s), dann *kann* das bewirken, daß dieses Programm unter der Benutzerkennung seines Owners ausgeführt wird.
Du darfst sicherlich Programme unter Deiner Kennung per FTP auf den Server laden.
Mit einem guten FTP-Client oder Telnet kannst Du auch das s-Bit setzen.
Bei einem Perl-Skript besteht aber das Problem, daß nicht etwa das Skript selbst 'ausgeführt' wird, sondern letztlich der Perl-Interpreter (der das Skript liest und *interpretiert*) - und dieser unter der Kennung, die ihn aufgerufen hat.
Wärest Du in der Lage, auf dem Server ein kleines C-Programm zu kompilieren, welches über system() das crontab-Kommando absetzt, dann könntest Du dieses Programm (mit s-Bit) unter der Kennung ausführen lassen, unter der es angelegt wurde.
(Vorausgesetzt, im Webserver sind nicht wiederum Sicherheitsmechanismen aktiv, welche die Ausführung eines s-Bit-Programms verhindern ... es gibt gegen die meisten Tricks eben auch Verteidigungsmöglichkeiten für den Server-Administrator).
mfG - Michael
Hi Michael,
danke fuer die Antwort - sehr aufschlussreich. Mein Programm wird letztendlich zwar in Perl geschrieben sein, aber mittels Perl2Exe in eine ausfuehrbare Datei gepackt sein, d.h. das duerfte schon mal kein Problem sein.
Ich werd diesen Ansatz mal verfolgen und testen, ob es sich lohnt oder ob ich es dem Enduser selbst ueberlasse seinen Cronjob einzurichten.
Vielen Dank
speedy
Hi auch,
Im Hilfetext von crontab hab ich das hier gefunden:
crontab [-u user] file
...
aber wie uebergeb ich dem Username und Passwort?
Ich denke, das erlaubt dem Systemadministrator, crontab-Jobs unter fremden Kennungen zu definieren (wenn er zu faul ist, mal schnell mit "su" seine Kennung zu ändern).
Passwort "is nich", der Administrator darf sowieso alles (auch "su" ohne Passwort-Angabe, übrigens).
Muss ich dann eine Datei mit dem Job anlegen und diese hier angeben?
Was ich noch nicht ausprobiert habe, ist, ob Du Deine crontab-Zeile vielleicht in ein "crontab -e" hinein pipen kannst, um das Anlegen einer statischen Datei zu vermeiden.
(Schlimmstenfalls halt Datei anlegen, crontab <dateiname>, Datei wieder löschen.)
Und wie siehts mit den Rechten aus? Das Skript laeuft ja mit den Rechten des http-Server (weis nicht genau, aber auf keinen Fall mit meinen Rechten, oder doch?).
Das mußt Du den Administrator fragen.
Es gibt einen Mechanismus, der es erlaubt, CGI-Skripte einzelner Anwendungen unter separaten Benutzerkennungen laufen zu lassen (http://httpd.apache.org/docs/suexec.html) - Dein Szenario (eigene Benutzerkennung via CGI) wäre also realisierbar. Ob Dein Administrator das allerdings aktiviert hat, weiß nur er.
mfG - Michael
Hi,
Es gibt einen Mechanismus, der es erlaubt, CGI-Skripte einzelner Anwendungen unter separaten Benutzerkennungen laufen zu lassen (http://httpd.apache.org/docs/suexec.html) - Dein Szenario (eigene Benutzerkennung via CGI) wäre also realisierbar. Ob Dein Administrator das allerdings aktiviert hat, weiß nur er.
schade, aber ich haett‚s mir fast denken koennen, dass ich nicht beliebig mal eben die Rechte meines Skripts aendern kann. Das Skript sollte naemlich ohne grossen Anpassungsaufwand auf vielen verschiedenen Systemen (die halt cgi und cron duerfen) laufen.
Viele Gruesse und danke
speedy