Alex Gots: Problem mit chmod

Hallo,

ich wollte nur die 777-Rechte auf ein Verzeichnis setzen, leider bekam ich den Rückgabewert 0. Was mache ich falsch?

8<--------8<--------8<

my $U_DIR = "/home/user";

sub MyChmod{

my $counter = chmod (0777, "$U_DIR");

return $counter;
}

8<--------8<--------8<

Danke und guten Rutsch! ;-)

  1. hi,

    ich wollte nur die 777-Rechte auf ein Verzeichnis setzen, leider bekam ich den Rückgabewert 0. Was mache ich falsch?

    1.) Hast du sicher die passenden Rechte dazu? Versuche es einmal mit dem gleichen User, mit dem du das Script startest mit /bin/chmod!!

    2.) Machst du das sicher auf einem Dateisystem, dass chmod unterstützt? Also reiserfs, ext2, ext3, ... (und nicht FAT)?

    1. 1.) Hast du sicher die passenden Rechte dazu? Versuche es einmal mit dem gleichen User, mit dem du das Script startest mit /bin/chmod!!

      Ich rufe den Skript über Browser (IE auf WinNT), also über CGI. Dann muss ich eigentlich OTHERS sein. ;)

      2.) Machst du das sicher auf einem Dateisystem, dass chmod unterstützt? Also reiserfs, ext2, ext3, ... (und nicht FAT)?

      Der Server ist auf dem QNX-BS (also auf dem Unix-Derivat).

      1. 1.) Hast du sicher die passenden Rechte dazu? Versuche es einmal mit dem gleichen User, mit dem du das Script startest mit /bin/chmod!!

        Ich rufe den Skript über Browser (IE auf WinNT), also über CGI. Dann muss ich eigentlich OTHERS sein. ;)

        Zumindest die Gruppe und der User des Webservers. Bei apache in httpd.conf einstellbar, bei mir z.B. www-data.
        Würde mich wundern, wenn du deinem Webserverprozess so viele Rechte geben willst...

        Gib einmal ps aux´ ein, schau' mit welchem user der Webserver läuft und wechsle mit su´ zu diesem Benutzer und mach es dann. Ich könnte mir vorstellen, dass du "Permission denied" bekommst.

        2.) Machst du das sicher auf einem Dateisystem, dass chmod unterstützt? Also reiserfs, ext2, ext3, ... (und nicht FAT)?

        Der Server ist auf dem QNX-BS (also auf dem Unix-Derivat).

        :-)

        Also chmod müsste dann fast unterstützt werden...

        Markus

        1. Zumindest die Gruppe und der User des Webservers. Bei apache in httpd.conf einstellbar, bei mir z.B. www-data.

          Das ist leider nicht der Fall ist, da ich das "slinger" nutze. Bei dem gibt's nicht so viel einzustellen. Alles funktioniert über Umgebungsvariablensetzen.

          Würde mich wundern, wenn du deinem Webserverprozess so viele Rechte geben willst...

          Das muss nur kurzfristig (bis max. 2 Sec) sein.

          1. Zumindest die Gruppe und der User des Webservers. Bei apache in httpd.conf einstellbar, bei mir z.B. www-data.

            Das ist leider nicht der Fall ist, da ich das "slinger" nutze. Bei dem gibt's nicht so viel einzustellen. Alles funktioniert über Umgebungsvariablensetzen.

            Kenne ich zwar nicht, aber trotzdem könntest du mit ps aux schauen, mit welchen Rechten der Webserver läuft.

            Würde mich wundern, wenn du deinem Webserverprozess so viele Rechte geben willst...

            Das muss nur kurzfristig (bis max. 2 Sec) sein.

            *löl*. Das hat damit wenig zu tun. Rechte abgeben ist einfach, sie wieder zurückzubekommen geht nicht.
            Ich würde was in diese Richtung machen:

            1.) Ein kleines (Perl/Bash) Script als Daemon starten, dass über Socket, TCP/IP@localhost, FIFO, Datei, ... über ein Ereignis in Kenntnis gesetzt wird und dann das bestimmte Verzeichnis auf 777 setzt oder umgekehrt.
            Das Script muss halt privilegiert sein (z.B. root oder Eigentümer des Verzeichnisses) und soll so wenig wie möglich Daten vom User entgegennehmen (keine Variablen vom Web, ....)

            2.) Ein Script wie oben schreiben und mit sudo starten, das wirklich nur ausgewählte Zeilen starten kann. /etc/sudoers lässt den Prozess des Webservers als root den Befehl fürs chmodden ausführen (und NUR diesen).

            Alles andere erscheint mir persönlich zu unsicher. So wie (2) habe ich es gemacht, um über Webinterface den MLdonkey starten/stoppen zu können, MP3 Platte (un)mounten oder sogar komplett die Internetverbindung kapern zu können. Darunter sind Scripts die auf z.B. iptables aufbauen und nur *eine* Aktion ausführen und nur dieses eine Kommando darf mit sudo ausgeführt werden.
            Das script ruft dann z.B. nur mehr auf:

            system("sudo /home/root/scripts/internet_disable.sh");
            oder
            system("sudo /home/root/scripts/internet_enable.sh");

            wobei natürlich zuerst trotzdem Passwortabfragen/IP Kontrolle etc stehen sollte.

  2. ich wollte nur die 777-Rechte auf ein Verzeichnis setzen, leider bekam ich den Rückgabewert 0. Was mache ich falsch?

    Keine Ahnung was du erwartest, meine Doku sagt über chmod:
    "Changes the permissions of a list of files. The first element of the list must be the numerical mode, which should probably be an octal number, and which definitely should not a string of octal digits: 0644 is okay, '0644' is not. Returns the number of files successfully changed. See also oct, if all you have is a string."

    Offensichtlich wurde kein File geändert.

    Struppi.

    1. "Changes the permissions of a list of files. The first element of [...]

      Das kenne ich bereits. Hilft aber nicht... :-(

      1. "Changes the permissions of a list of files. The first element of [...]

        Das kenne ich bereits. Hilft aber nicht... :-(

        wieso?

        Du hast gefragt, warum du als Rückgabewert 0 bekommst. Offensichtlich, weil kein file geändert wird.

        Struppi.

        1. » Du hast gefragt, warum du als Rückgabewert 0 bekommst. Offensichtlich, weil kein file geändert wird.

          Es müssen nur die 777-Rechte einem Verzeichnis vergeben, damit ich dorthin eine Datei hochladen darf.

          1. Es müssen nur die 777-Rechte einem Verzeichnis vergeben, damit ich dorthin eine Datei hochladen darf.

            Und das tut chmod nicht?

            Wie gesagt der Rückgabewert gibt dir keine Informationen darüber welche Rechte die Datei hat.
            Ich kenne mich mit Unix nicht so aus aber ich vermute das du eher
            -r, -w, -x oder stat suchst.

            Struppi.

            1. »Wie gesagt der Rückgabewert gibt dir keine Informationen darüber welche Rechte die Datei hat.

              Das ist mir auch bekannt und ich erwarte damit mindestens $return = 1... Es geht aber nicht :-(

              1. »Wie gesagt der Rückgabewert gibt dir keine Informationen darüber welche Rechte die Datei hat.

                Das ist mir auch bekannt und ich erwarte damit mindestens $return = 1... Es geht aber nicht :-(

                Warum erwartest du eine 1?

                du bist sicher das chmod die Rechte Datei ändert und die Datei nicht vorher schon die gleichen Rechte hatte?

                Struppi.

                1. Warum erwartest du eine 1?

                  Weil ich nun die Rechte einem Verzeichnis vergeben möchte. Im Buch steht es auch: "[...]Die Funktion liefert die Anzahl der erfolgreich geänderten Dateien zurück.[...]" (ISBN 3-930673-48-7 S.156)

                  du bist sicher das chmod die Rechte Datei ändert und die Datei nicht vorher schon die gleichen Rechte hatte?

                  Ich sehe über telnet, dass mein Verzeichnis diese Rechte hat:

                  drwxr-xr-x  usere 101 /home/user

                  D.h. - 755. Ich will dagegen - 777... :-(

                  1. Warum erwartest du eine 1?

                    Weil ich nun die Rechte einem Verzeichnis vergeben möchte. Im Buch steht es auch: "[...]Die Funktion liefert die Anzahl der erfolgreich geänderten Dateien zurück.[...]" (ISBN 3-930673-48-7 S.156)

                    Das ist ja schon lange klar, was ich dir sagen will ist das die Funktion offensichtlich keine Rechte ändert. Da die Funktion im allgemeinen ja keine Probleme macht, dürfte der Fehler wo anders liegen.

                    drwxr-xr-x  usere 101 /home/user

                    D.h. - 755. Ich will dagegen - 777... :-(

                    Das einzige, was mir noch einfällt ist, dass du vor dem ändern prüfst, ob das Verzeichniss existiert.

                    die "no dir" unless -d $U_DIR;

                    Struppi.

                    1. Das einzige, was mir noch einfällt ist, dass du vor dem ändern prüfst, ob das Verzeichniss existiert.

                      Ich glaube, dass ich langsam... ;-) begreife, wo es hackt.

                      Meine CGIs liegen hier:

                      /home/user/cgis/*.pl

                      und mein Webserver (slinger) wird, als others gestartet und darf natürlich auf keinen Fall die Rechte dem Verzeichnis /home/user vergeben! Wie blöd von mir! ;-)

                      Danke für Ihre Mühe!