2012-05-30 6 views
5

Las llamadas a la función is_readable() de PHP devuelven falso en un directorio que se puede leer desde el símbolo del sistema. Cambié los permisos a los más permisibles y todavía no tuve suerte.PHP is_readable() falla en el directorio samba legible

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 

ejecutando el código siguiente ...

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"; } 

... ... resultados en

share ok 
local ok 
second BAD 
raid BAD 

cualquier directorio de la parte de la samba que no está en la partición primaria física parece fallar

detalles de configuración de la máquina en la que is_readable() se llama:

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 

detalles de configuración de la máquina remota:

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 

He intentado todo lo que puedo pensar para conseguir este trabajo, y ahora Me siento tonto. :-) También puedo proporcionar la configuración del kernel si eso parece relevante para cualquier persona. ¡Gracias por cualquier ayuda!

+0

'second_share', como en realidad es un OTRA cuota de samba montado, debajo de la parte principal de samba? –

+0

No, es una segunda unidad montada en la máquina remota, ubicada en el directorio compartido de samba. Por alguna razón, todos los directorios ubicados físicamente en la partición primaria en esa máquina funcionan, pero otras ubicaciones montadas en diferentes particiones no. – moodboom

+0

Marc B, actualicé la pregunta para aclarar esto mejor. – moodboom

Respuesta

1

No encontré una respuesta simple para esto, así que creé un nuevo PHP bug ticket para rastrear el problema mejor. Gracias por toda la entrada!

1

is_readable() simplemente envuelve la llamada al sistema access para determinar el permiso de archivo, por lo que es muy probable que no sea un problema de php.

Según la configuración de samba y los permisos de archivo, una razón muy probable podría ser SELINUX. PHP probablemente se esté ejecutando como un usuario diferente (no importa si CLI está en modo apache), por lo que es posible que selinux niegue el acceso a este usuario.

Compruebe si se habilita y deshabilita Selinux o configúrelo como apropiado.

+0

Gracias Sebastian. No tengo SELINUX habilitado. Estoy ejecutando la prueba PHP desde la línea de comando, como el usuario "yo" en el ejemplo, por lo que no es un usuario diferente en ese caso. Escribiré un código C y veré qué acceso() me da ... El acceso – moodboom

+0

parece funcionar bien. código: 'cout <<" acceder R_OK compartir: "<< acceso ("/remote/samba_share ", R_OK) << endl; cout << "acceder R_OK local:" << acceso ("/ remote/samba_share/local_dir", R_OK) << endl; cout << "acceder R_OK segundo:" << acceso ("/ remote/samba_share/second_drive", R_OK) << endl; cout << "acceder R_OK incursión:" << acceso ("/ remote/samba_share/ext_raid", R_OK) << endl; ' resultado: ' R_OK acceso de la parte: 0' ' R_OK acceso local: 0' 'R_OK acceso segundos: 0' ' incursión acceso R_OK: 0' supongo que tengo que cavar en el Código de motor para el Zend acceso() llamada ...? – moodboom

+0

@sebastian: es muy poco probable que php se ejecute como un usuario diferente cuando se encuentre en modo CLI; se requieren permutales de root para cambiar entre los identificadores de usuario. –

Cuestiones relacionadas