CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
| Hi @all, ich bin gerade dabei ein paar Skripte zu Enwickeln, die den Status bestimmter dienste abfragen. Jetzt habe ich das Problem, dass wenn ein Skript aufgerunfen wird mit dem wwwrun User ausgefürht wird. Wie kann ich die Skripte mit root-Rechten laufen lassen? Das Skript sieht wie folgt aus: #!/usr/bin/perluse strict; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variablen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ my $ServicesDirectory="/etc/init.d/rc3.d"; # Verzeichnis in dem sich die zu Startenden Dienste befinden # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hauptprogramm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ print"<table border=1 align=center>"; print"<center><h1>Auswertung Dienste</h1></center>"; my @service = <$ServicesDirectory/S*>; foreach my $service (@service){ $service=~s/$ServicesDirectory\///; next if "$service" =~ "S[0-9]*bigbrother" || "$service" =~ "S[0-9]*hwscan" || "$service" =~ "S[0-9]*learnvipa" || "$service" =~ "S[0-9]*fbset" || "$service" =~ "S[0-9]*rpmconfigcheck" || "$service" =~ "S[0-9]*smbfs" || "$service" =~ "S[0-9]*nfs" || "$service" =~ "S[0-9]*nfsboot" || "$service" =~ "S[0-9]*splash_early" || "$service" =~ "S[0-9]*running-kernel" || "$service" =~ "S[0-9]*kbd" || "$service" =~ "S[0-9]*splash" || "$service" =~ "S[0-9]*ITCAM" || "$service" =~ "S[0-9]*rebootmail" || "$service" =~ "S[0-9]*dsmcad" || "$service" =~ "S[0-9]*custstart"; $service=~s/S[0-9]*/rc/; # Sxx nach rc wandeln (z.B. S016apache --> rcapache) my $ServiceStatus=`$service status >/dev/null && echo OK || echo FEHLER`; #print "$service ==> $ServiceStatus\n"; #print "<br>"; if ($ServiceStatus eq "OK"){ $service=~s/rc//; print "<tr> <td>$service</td> <td bgcolor=#00FF00>ok</td> </tr>"; } elsif($ServiceStatus eq "FEHLER"){ $service=~s/rc//; print "<tr> <td>$service</td> <td bgcolor=#ff0000>FEHLER</td> </tr>"; } } print "</table>";
Datum: 02.05.2007-11:03

|
re: CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
| Schlechte Idee! Du solltest so gut es geht vermeiden Skripte mit mehr Rechten laufen zu lassen als notwendig. Empfehlenswert sind 2 Skripte. Das erste Skript, welches kein CGI ist und mit mehr Berechtigung laeuft, wird regelmaeszig von einen Cronjob aufgerufen. Es sammelt die Informationen ueber die Dienste und schreibt sie in eine Datenbank oder Textdatei. Das CGI-Script benoetigt dann keine Sonderberechtigung fuer die Ausfuehrung, nur Zugriff auf die Datenbank bzw. Textdatei um die Informationen auszulesen. So hast du beides sauber voneinander getrennt und damit das Sicherheitsrisiko minimiert.
Datum: 02.05.2007-13:25

|
re: CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
"$service" =~ "S[0-9]*kbd"
Die Anfuehrungszeichen um '$service' sind voellig unnoetig und mit dem Anfuehrungszeichen als Begrenzer fuer das Regex-Muster waere ich vorsichtig, denn wenn du irgendwann einmal Escapesequenzen verwendest kommt es zu einen Fehler.
$service =~ "S[0-9]*\w+"
So funktioniert es wieder
$service =~ m"S[0-9]*\w+"
Datum: 02.05.2007-14:17

|
re: CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
Hab deinen Code mal ein wenig gekuerzt, vielleicht gefaellt's dir ja und willst es uebernehmen #!/usr/bin/perluse strict; use warnings; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variablen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ my $ServicesDirectory="/etc/rc3.d"; # Verzeichnis in dem sich die zu Startenden Dienste befinden # auszuschlieszende Dienste my @exclude_srv = qw( bigbrother hwscan fbset rpmconfigcheck smbfs nfs nfsboot splash_early running-kernel kbd splash ITCAM rebootmail custstart ); opendir(DH, $ServicesDirectory) or die $!; foreach my $service ( readdir(DH) ) { next if $service =~ /^\.\.?$/; $service =~ s/S\d{2}//; next if grep($service eq $_, @exclude_srv); my $ServiceStatus = `$service status >/dev/null && echo OK || echo FEHLER`; # ... } closedir(DH);
In '@exclude_srv' stehen die Dienste die uebersprungen werden sollen, so lassen sich leicht weitere Dienste der Liste hinzufuegen und es ist nicht mehr so ineffizient wie die ganzen Regexps.
Datum: 02.05.2007-14:23

|
re: CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
Sorry, da ist noch 'n kleiner Fehler, diese Zeile benoetigt eine Korrektur
next if $service =~ /^\.\.?$/;
->
next if $service =~ /^\.\.?$|^K/;
damit auch Eintraege mit einen 'K' am Anfang ausgeschlossen werden.
Datum: 02.05.2007-14:29

|
re: CGI Skripte mit root rechten ausführen?
|
Seitenanfang |
| Hi, danke für deine Hilfe. Ich denke ich werde das Problem wohl so lösen müssen. Ich werde das Skript und die HTML Seite trennen. Danke für die kürzung des Codes, arbeite noch nicht so lange mit Perl. Gruß Marcus
Datum: 02.05.2007-16:15

|