Hendrik Kammholz: Bash Befehle in Perl, z.B. system

Hallo an Alle!
Folgendes Perl-Script habe ich - leicht abgewandelt - abgetippt:

#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Vergleich = system("chmod 0777 /home/gruppen/");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print $Vergleich."\n";
if($Vergleich == 0) {
  print "Alles in Ordnung!\n";
}
else {
  print "Nix gudd!\n";
}
print "</body></html>\n";

Bei Ausführung mit einem Browser hat der Perl-Interpreter den system-Befehl nicht ausgeführt, anstatt dessen erhalte ich folgende Meldung am Bildschirm:

256 Nix gudd!

Ich muss dazu sagen, dass der system-Befehl auf viele Bash-Befehle nicht reagiert. Mein eigentliches Ansinnen ist die Integration von Befehlen wie “useradd”, “userdel” usw.. in Perl-Scripte. Bisher ist mir die Umsetzung mit system noch nie gelungen. Gleiches gilt für exec ud Backtics.
Rufe ich das gleiche Programm jedoch über die Bash-Befehlszeile auf, dann funktioniert es.

linux:/srv/www/cgi-bin # /usr/bin/perl -w ./bs4.pl
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Test-Ausgabe</title></head><body>
0
Alles in Ordnung!
</body></html>

Was mache ich falsch? Der Perl-Interpreter liegt in “/usr/bin/”. Ich arbeite (als Anfänger) mit Suse 9.2.
Viele Grüße:
H. Kammholz

  1. Hi!

    #!/usr/bin/perl -w
    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Vergleich = system("chmod 0777 /home/gruppen/");

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print $Vergleich."\n";
    if($Vergleich == 0) {
      print "Alles in Ordnung!\n";
    }
    else {
      print "Nix gudd!\n";
    }
    print "</body></html>\n";

    Bei Ausführung mit einem Browser hat der Perl-Interpreter den system-Befehl nicht ausgeführt, anstatt dessen erhalte ich folgende Meldung am Bildschirm:

    256 Nix gudd!

    Unter welcher Benutzerkennung läuft denn der Apache? CGI-Programme werden nämlich - sofern man nicht sowas wie suexec einsetzt - auch unter der Kennung des Apache-Benutzers ausgeführt. Dieser ist mit großer Sicherheit nicht der Besitzer des Ordners /home/gruppen, sodass dein Unterfangen bereits aufgrund fehlender Rechte fehlschlägt.

    Rufe ich das gleiche Programm jedoch über die Bash-Befehlszeile auf, dann funktioniert es.

    linux:/srv/www/cgi-bin # /usr/bin/perl -w ./bs4.pl
    Content-type: text/html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html><head><title>Test-Ausgabe</title></head><body>
    0
    Alles in Ordnung!
    </body></html>

    Soweit ich mich erinnern kann, ist das oben der Standard-Prompt für den User »root« unter SuSE - insofern ist es auch nicht verwunderlich, dass ein entsprechendes chmod dann auch klappt.

    Grüße,
    Fabian St.

  2. #!/usr/bin/perl -w
    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Vergleich = system("chmod 0777 /home/gruppen/");

    Warum nutzt du nicht den Perl Befehl dazu.
    http://de.selfhtml.org/perl/funktionen/dateiverwaltung.htm#chmod

    Wobei ich aber auch vermute dass es wohl eher daran liegt was Fabian geschrieben hat.

    Struppi.

  3. Hallo Hendrik,

    Mein eigentliches Ansinnen ist die Integration von Befehlen wie “useradd”, “userdel” usw.. in Perl-Scripte. Bisher ist mir die Umsetzung mit system noch nie gelungen. Gleiches gilt für exec ud Backtics.

    In Perl gibt es den Taint mode (perlsec), was für dein genanntes Vorhaben dringend angeraten ist.

    Gruß,
    Benne

    --
    ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)
  4. Moin!

    Folgendes Perl-Script habe ich - leicht abgewandelt - abgetippt:

    Perl-CGI-Skripte einfach abzutippen, ohne ansatzweise zu wissen, was dort vorgeht, birgt Risiken, was du hoffentlich weißt.

    #!/usr/bin/perl -w

    Du möchtest hier lieber #! /usr/bin/perl -Tw schreiben, wo auch schon Benne darauf hinweist.

    use strict;

    use CGI::Carp qw(fatalsToBrowser);

    my $Vergleich = system("chmod 0777 /home/gruppen/");

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print $Vergleich."\n";
    if($Vergleich == 0) {
      print "Alles in Ordnung!\n";
    }
    else {
      print "Nix gudd!\n";

      
    Wenn du wissen willst, was hier genau schiefgegangen ist, kannst du die vordefinierte Variable $! auswerten, die die Meldung des zuletzt aufgetretenen Fehlers enthält, z.B.  
      
    `print "Nix gudd: $!\n";`{:.language-perl}  
      
    
    > ~~~perl
    
    }  
    
    > print "</body></html>\n";
    
    

    Bei Ausführung mit einem Browser hat der Perl-Interpreter den system-Befehl nicht ausgeführt, anstatt dessen erhalte ich folgende Meldung am Bildschirm:

    256 Nix gudd!

    Du weißt hier nur, dass chmod nicht geklappt hat (system wurde ausgeführt, es schlug nur fehl) und den Fehlercode 256 zurückgibt. Wenn du den Fehlercode um 8 Bit verschiebst $err = $Vergleich >> 8 (kann auch nach links sein) erhältst du den Fehlercode von chmod, wie in dessen Manpage angegeben.

    Ich muss dazu sagen, dass der system-Befehl auf viele Bash-Befehle nicht reagiert.

    Er reagiert schon darauf, nur wahrscheinlich schlägt deren Ausführung mangelnder Rechte fehl.

    Mein eigentliches Ansinnen ist die Integration von Befehlen wie “useradd”, “userdel” usw.. in Perl-Scripte.

    Darf man fragen, was du damit vorhast? Ich hoffe, du schützt deine Perlskripte gegen unberechtigten Zugriff, sonst darfst du dich nicht wundern, wenn dir dein Rechner bald zwar noch physisch gehört, aber du nicht mehr die Gewalt darüber hast.

    Viele Grüße,
    Robert