• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Solved]Befehl touch geht aus einem Perl Script heraus nicht

byron1778

Hacker
Hallo Forum,

ich weiss nicht, ob ich hier richtig bin, aber ich versuche es hier einmal.

Ich habe folgende Script ( HTML - Perl ) fuer einen Jumpstart Server unter Solaris 10 geschrieben.

Dabei werden die Paramter aus einem textarea uebernommen und sollen dann in eine neue Datei eingespielt werden ( sysidcfg ).
Leider aber funktioniert der touch Befehl nicht.

Habe auch schon folgendes versucht, anderen Pfad anzugeben, Benutzerrechte veraendert, geht aber alles nicht.
Ich vermute, dass es vll. mit den Rechten des Apache unter dem er laeuft zu tun hat, bin mir aber da nicht sicher.

Folgende Rechte:



  • Apache - nobody
    cgi-bin - drwxr-xr-x 2 root bin 512 May 14 11:39 cgi-bin
    File - alle Rechte

Code:
#!/usr/bin/perl -w

use CGI::Carp qw(fatalsToBrowser);

read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>CGI-Feedback</title></head>\n";
print "<body><h1>CGI-Feedback vom Programm <i>comments.pl</i></h1>\n";
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
 {
  ($name, $value) = split(/=/, $Feld);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s///g;
#  $Formular{$name} = $name;
#  $Formular{$value} = $value;

#print "<p></p>\n";
#print "$value\n";
#  print "$Formular{$name} = $Formular{$value}", "<br>\n";
 }
print "</body></html>\n";

$rc=system("/usr/bin/touch /var/apache/cgi-bin/sysidcfg");
print "Error Code von system $rc";

Vll. kann mir jemand da weiterhelfen.

Danke vielmals
 

regexer

Advanced Hacker
Du musst auf das Verzeichnis Schreibrechte haben, um eine neue Datei anzulegen ...

Noramlerweise müsste die entsprechende touch-Fehlermeldung ganz normal auf STDERR ausgegeben werden. Um das zu prüfen kann man die Ausgabe auch in eine Datei umleiten. In etwa so:

Code:
system("/usr/bin/touch /var/apache/cgi-bin/sysidcfg 2>/tmp/touch.log");


Blöde Frage am Rande: Warum verwendest du nicht die perl-Funktion open?
 
OP
B

byron1778

Hacker
Hallo,

danke Dir vielmals.
Hat perfekt geklappt.
Bin irgendwie schon zu weit mit meinen Gedanken gewesen, um diesen "leichten" Schritt noch selber herauszufinden.

Bzgl. der open - Funktion, die ist mir nicht in den Sinn gekommen, worin liegt ihr Vorteil gegenueber der touch - Funktion?
Ich weiss, dass touch ein Unix Befehl ist und mit system ein 2ter Prozess geoeffnet wird.
Aber hat es ausser einem Geschwindigkeitsvorteil vll. noch irgendeinen anderen Vorteil?
 

regexer

Advanced Hacker
byron1778 schrieb:
Aber hat es ausser einem Geschwindigkeitsvorteil vll. noch irgendeinen anderen Vorteil?
1. Da es sich um eine Perl-Funktion handelt ist man System-unabhängig.
2. Man kann schön sauber $! ausgeben...
Code:
open (FILE, ">>/var/apache/cgi-bin/sysidcfg") || print "$!\n";
 
Oben