[PHP] ftp_site() CHMOD geeft true maar doet niets

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55
Casus
Voor een web applicatie die ik onlangs gemaakt heb ben ik een installatie script aan het schrijven. Het is de bedoeling dat dit script een aantal settings op de server controleert (PHP versie, DB Versie, geinstalleerde appache modules etc.) Een van de onderdelen van het script is het checken van de juiste rechten van een aantal mappen, met behulp van de sql module binnen PHP.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        // check file permissions
        $dir = array("html","upload","upload/Downloads","upload/File","upload/Image","upload/Photobook");

        $mode = "0777";
        $base = "/public_html/private/ZDE/C2G/project_source/";

        if($ftp = ftp_connect($_POST["ftp_server_adres"],$_POST["ftp_server_port"]))
                {
                    if(ftp_login($ftp, $_POST["ftp_username"], $_POST["ftp_password"]))
                    {
                        for($nr=0; $nr < count($dir); $nr++)
                        {
                            if(!is_writable($dir[$nr]))
                            {
                                echo "ftp_site(".$ftp.", 'CHMOD ".$mode." ".$base.$dir[$nr]."'); returned ";
                                echo (ftp_site($ftp, sprintf('CHMOD %o %s', $mode, $base.$dir[$nr])) == true) ? 'true' : 'false';
                                echo "<br />";
                            }
                        }
                    }

                    ftp_close($ftp);
}

Let even niet op het slechte gebruik van user input

Probleem
Het probleem is dat het met bovenstaand script niet lukt om de mappen die nog rechten nodig hebben te setten. Dit is echter vreemd, want het resultaat van de functie
PHP:
1
ftp_site($ftp, sprintf('CHMOD %o %s', $mode, $base.$dir[$nr]))
is true (wat aangeeft dat het commando succesvol is uitgevoerd).

Zoals in het eerste code blok te zien is heb ik getracht om wat debug informatie te verkrijgen. Het resultaat van dit code blok is
code:
1
2
3
4
5
ftp_site(Resource id #9, 'CHMOD 0777 /public_html/private/ZDE/C2G/project_source/upload'); returned true
ftp_site(Resource id #9, 'CHMOD 0777 /public_html/private/ZDE/C2G/project_source/upload/Image'); returned
Warning: ftp_site(): /public_html/private/ZDE/C2G/project_source/upload/Image: Permission denied in /home/wouter/public_html/private/ZDE/C2G/project_source/install.php on line 246
false
[etc...]


Dit klopt gezien de rechten op deze twee directory's

code:
1
2
dr----x--t   7 wouter wouter  4096 2006-09-22 10:58 upload
drwxr--r--   7 wouter wouter  4096 2006-09-22 10:58 upload/Image


Het script heeft dus geen rechten om binnen de map upload rechten uit te kunnen delen. Echter als het script uitgevoerd zou worden zouden de rechten van de eerste map op 777 ingesteld moeten worden waardoor de binnen liggende map ook van rechten voorzien zou kunnen worden.

Ik heb het commando ook direct in ftp (FlashFXP) gebrobeerd

code:
1
2
[19:16:32] [R] site CHMOD 0777 /public_html/private/ZDE/C2G/project_source/upload
[19:16:32] [R] 200 SITE CHMOD command successful


Het commando is dus correct!

Omgeving
OS: Debian Sarge
PHP Versie: 4.3.10-18
MySQL Versie: 4.1.11-Debian_4sarge7-log
Safe mode: off
Register globals: off
Magic quotes: on
FTP support enabled: yes
Mod_rewrite enabled: yes

Ondernomen acties
  • PHP FTP manual doorgenomen
  • Diverse Google Zoek Acties
  • W3C pagina gelezen
  • andere servers geprobeerd (Fedora & Debian)
  • logs op de server nagelopen
    code:
    1
    2
    3
    
    Nov 21 19:32:46 homer proftpd[3158]: xxxxx.xs4all.nl (xxxxx.xs4all.nl[192.168.1.3]) - FTP session opened.
    Nov 21 19:32:46 homer proftpd[3158]: xxxxx.xs4all.nl (xxxxx.xs4all.nl[192.168.1.3]) - mod_delay/0.4: delaying for 17 usecs
    Nov 21 19:32:46 homer proftpd[3158]: xxxxx.xs4all.nl (xxxxx.xs4all.nl[192.168.1.3]) - FTP session closed.
Blijkbaar wordt het commando op de server dus helemaal niet ontvangen. Mijn collega gaf aan dat de commando's wellicht te snel achter elkaar worden uitgevoerd, om dit te testen heb ik na ieder commando 1 seconde sleep ingesteld, maar ook dat had geen effect 8)7

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55
Ok ik heb het probleem opgelost. Na veel proberen (lees prutsen)ben ik er achter gekomen dat om de een of andere reden

PHP:
1
ftp_site($ftp, sprintf('CHMOD %o %s', $mode, $base.$dir[$nr]))


niet (goed) werkt.

PHP:
1
ftp_site($ftp, 'CHMOD '. $mode.' '. $base.$dir[$nr])


Werkt echter wel goed!

[ Dislect ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik denk dat het komt omdat je %o gebruikt voor een octaal nummer, ik weet niet of ie dan werkelijk een "vertaling" doet, maar CHMOD 0777 staat reeds in octaal.

edit: en je "set" hem als een string ("0777")!

[ Voor 13% gewijzigd door Verwijderd op 22-11-2006 12:03 ]