2012-05-30 30 views
5

調用PHP的is_readable()函數在可從命令提示符讀取的目錄上返回false。我已將權限更改爲最容許,但仍然沒有運氣。PHP is_readable()在可讀的samba目錄上失敗

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 

運行下面的代碼...

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

...結果...

share ok 
local ok 
second BAD 
raid BAD 

桑巴共享下的任何目錄不是對物理主分區似乎失敗了。

機的配置細節,其中is_readable()被調用:

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 
遠程機器的

配置細節:

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 

我已經試過所有我能想到的得到這個工作,現在我覺得很愚蠢。 :-)如果這似乎與任何人有關,我也可以提供內核配置。謝謝你的幫助!

+0

「second_share」,作爲這實際上其他一些安裝Samba共享,主要桑巴共享下? –

+0

不,它是安裝在遠程機器上的第二個驅動器,位於samba共享目錄下。由於某種原因,物理上位於該機器主分區上的每個目錄都可以正常工作,但安裝在不同分區上的其他位置則不會。 – moodboom

+0

Marc B,我更新了這個問題,以更好地闡明這一點。 – moodboom

回答

1

我沒有找到這一個簡單的答案,所以我創建了一個新的PHP bug ticket,以更好地跟蹤問題。感謝所有的投入!

1

is_readable()只是打包access系統調用來確定文件權限,所以它很可能不是一個PHP問題。

根據Samba配置和文件權限一個非常可能的原因可能是SELINUX。 PHP可能以不同的用戶身份運行(不管是否使用CLI),所以可能是因爲selinux拒絕訪問此用戶。

所以,檢查是否啓用SELinux和禁用它或者配置它合適。

+0

謝謝塞巴斯蒂安。我沒有啓用SELINUX。我從命令行運行PHP測試,作爲示例中的「我」用戶,所以在這種情況下它不是一個不同的用戶。我會寫一些C代碼,看看什麼訪問()給我... – moodboom

+0

訪問似乎工作正常。(訪問R_OK共享:「<< access(」/ remote/samba_share「,R_OK)<< endl; cout <<「access R_OK local:」<< access(「/ remote/samba_share/local_dir」,R_OK)<< endl; cout <<「access R_OK second:」<< access(「/ remote/samba_share/second_drive」,R_OK)<< endl; cout <<「access R_OK raid:」<< access(「/ remote/samba_share/ext_raid」,R_OK)<< endl;' 結果: '訪問R_OK份額:0' '訪問R_OK地方:0' '訪問R_OK第二:0' '訪問R_OK RAID:0' 我想我需要深入的Zend引擎代碼access()調用...? – moodboom

+0

@sebastian:在CLI模式下,php不太可能作爲一個不同的用戶運行 - 根用戶權限需要在用戶id之間切換。 –