2012-05-30 4 views
5

Aufrufe der PHP-Funktion is_readable() geben false für ein Verzeichnis zurück, das an der Eingabeaufforderung lesbar ist. Ich habe die Berechtigungen auf die meisten zulässigen und immer noch kein Glück geändert.PHP is_readable() scheitert an lesbarem Samba-Verzeichnis

ls -lad /remote/samba_share 
drwxrwxr-x 13 me users 0 May 29 15:49 /remote/samba_share 

ls -la /remote/samba_share 
drwxr-xr-x 4 me users 0 May 8 14:19 /remote/samba_share/local_dir 
drwxr-xr-x 16 me users 0 May 14 19:49 /remote/samba_share/second_drive 
drwxrwxrwx 12 me users 0 May 30 09:42 /remote/samba_share/ext_raid 

den folgenden Code Ausführen ...

if (is_readable('/remote/samba_share'    )){ echo "share ok\n"; } else { echo "share BAD\n"; } 
if (is_readable('/remote/samba_share/local_dir' )){ echo "local ok\n"; } else { echo "local BAD\n"; } 
if (is_readable('/remote/samba_share/second_drive')){ echo "second ok\n"; } else { echo "second BAD\n"; } 
if (is_readable('/remote/samba_share/ext_raid' )){ echo "raid ok\n"; } else { echo "raid BAD\n"; } 

... Ergebnisse in ...

share ok 
local ok 
second BAD 
raid BAD 

Jedes Verzeichnis unter der Samba-Freigabe, die nicht auf der physischen primäre Partition ist scheint zu versagen.

Config Details der Maschine, wo is_readable() aufgerufen wird:

php -v 
PHP 5.3.11-pl0-gentoo (cli) (built: May 5 2012 16:48:35) 

php.ini: 
    safe_mode = Off 
    safe_mode_gid = On # (tried either way, shouldn't matter) 
    ;open_basedir = 

/etc/fstab entry: 
    //remote_machine/samba_share /remote/samba_share cifs iocharset=utf8,credentials=/blahblah/samba_credentials,uid=me,gid=users,file_mode=0777,dir_mode=0777,auto 0 0 

eix samba 
[I] net-fs/samba 
    Installed versions: 3.5.15!t 

Config Details der Remote-Rechner:

eix samba 
[I] net-fs/samba 
    Installed versions: 3.5.15!t 

/etc/samba/smb.conf: 

    [samba_share] 
     path = /samba_share/ 
     public = yes 
     writable = yes 
    ; printable = yes 
     browseable = yes 
     create mask = 0777 
     create mode = 0777 
     directory mode = 0777 

Ich habe versucht, alles, was ich denken kann, diese Funktion zu erhalten, und jetzt Ich fühle mich dumm. :-) Ich kann Kernel Config auch zur Verfügung stellen, wenn das für irgendjemanden relevant erscheint. DANKE für jede Hilfe!

+0

'second_share', wie ist das in der Tat etwas ANGEHEN montierte Samba-Freigabe, unter der Samba-Hauptfreigabe? –

+0

Nein, es ist ein zweites Laufwerk, das auf dem Remote-Rechner unter dem Samba-Share-Verzeichnis installiert ist. Aus irgendeinem Grund funktioniert jedes Verzeichnis, das sich physisch auf der primären Partition auf diesem Rechner befindet, aber andere Standorte, die auf anderen Partitionen gemountet sind, nicht. – moodboom

+0

Marc B, ich habe die Frage aktualisiert, um das besser zu klären. – moodboom

Antwort

1

Ich habe keine einfache Antwort dafür gefunden, also habe ich eine neue PHP bug ticket erstellt, um das Problem besser aufzuspüren. Danke für den ganzen Input!

1

is_readable() umschließt einfach den access Systemaufruf, um die Dateiberechtigung zu ermitteln, also ist es sehr wahrscheinlich kein PHP-Problem.

Entsprechend der Samba-Konfiguration und Dateiberechtigungen könnte SELINUX ein sehr wahrscheinlicher Grund sein. PHP läuft wahrscheinlich als anderer Benutzer (egal ob CLI, ob Apache mod), also könnte selinux den Zugriff für diesen Benutzer verweigern.

Überprüfen Sie, ob selinux aktiviert oder deaktiviert ist, oder konfigurieren Sie es entsprechend.

+0

Danke Sebastian. Ich habe SELINUX nicht aktiviert. Ich führe den PHP-Test von der Kommandozeile aus, als "mich" -Benutzer im Beispiel, also ist es in diesem Fall kein anderer Benutzer. Ich werde etwas C-Code schreiben und sehen, was Zugriff() gibt mir ... – moodboom

+0

Zugriff scheint gut zu funktionieren. code: 'cout <<" Zugriff R_OK Freigabe: "<< Zugriff ("/remote/samba_share ", R_OK) << endl; cout << "Zugriff R_OK lokal:" << Zugriff ("/ remote/samba_share/local_dir", R_OK) << endl; cout << "Zugriff R_OK Sekunden:" << Zugriff ("/ remote/samba_share/second_drive", R_OK) << endl; cout << "Zugriff R_OK raid:" << Zugriff ("/ remote/samba_share/ext_raid", R_OK) << endl; ' Ergebnis: 'Zugang R_OK Anteil: 0 ' ' Zugang R_OK local: 0' 'Zugang R_OK Sekunde: 0 ' ' Zugang R_OK raid: 0' Ich glaube, ich muss für die in die Zend Engine Code graben Zugang() Anruf ...? – moodboom

+0

@sebastian: Es ist sehr unwahrscheinlich, dass php im CLI-Modus als ein anderer Benutzer ausgeführt wird - Root-Perms sind erforderlich, um zwischen Benutzer-IDs zu wechseln. –

Verwandte Themen