【问题标题】:PHP is_readable() fails on readable samba directoryPHP is_readable() 在可读的 samba 目录上失败
【发布时间】:2012-05-30 14:52:03
【问题描述】:

对 PHP 的 is_readable() 函数的调用在可从命令提示符读取的目录上返回 false。我已将权限更改为最允许,但仍然没有运气。

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

任何不在物理主分区上的 samba 共享目录似乎都失败了。

调用 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

我已经尝试了所有我能想到的方法来让它发挥作用,但现在我感到很愚蠢。 :-) 如果这似乎与任何人相关,我也可以提供内核配置。感谢您的帮助!

【问题讨论】:

  • 'second_share',因为那实际上是一些 OTHER 挂载的 samba 共享,位于主 samba 共享下方?
  • 不,它是安装在远程机器上的第二个驱动器,位于 samba 共享目录下。出于某种原因,物理上位于该机器主分区上的每个目录都可以正常工作,但安装在不同分区上的其他位置则不能。
  • Marc B,我更新了问题以更好地澄清这一点。
  • 我现在有一个解决方法。我可以在直接共享 ext_raid 挂载点的远程机器上设置一个 samba 共享,并且 is_readable() 返回 true。在这一点上,这对我来说似乎是一个 PHP 错误。 is_readable() 似乎不能容忍 samba 共享路径中的跨分区。
  • 如果其他人能够在这里验证我的结论,我将接受他们的回答并提交 PHP 错误报告。谢谢!

标签: php samba cifs


【解决方案1】:

is_readable() 只是包装了access 系统调用以确定文件权限,因此很可能不是 php 问题。

根据 samba 配置和文件权限,很可能是 SELINUX。 PHP 可能以不同的用户身份运行(无论 CLI 是否是 apache mod),所以可能是这样 selinux 拒绝此用户的访问。

所以检查 selinux 是否被启用和禁用或适当地配置它。

【讨论】:

  • 谢谢塞巴斯蒂安。我没有启用 SELINUX。我从命令行运行 PHP 测试,作为示例中的“我”用户,所以在这种情况下它不是不同的用户。我会写一些 C 代码,看看 access() 给了我什么...
  • 访问似乎工作正常。代码:cout << "access R_OK share: " << 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;' result: access R_OK 分享:0` access R_OK local: 0 access R_OK second: 0 access R_OK raid: 0 我想我需要深入研究用于 access() 调用的 Zend 引擎代码...?
  • @sebastian:在 CLI 模式下,php 不太可能以不同的用户身份运行 - 需要 root 权限才能在用户 ID 之间进行更改。
  • @moodboom:我真的没想到会这样。刚刚查看了代码 (github.com/php/php-src/blob/master/ext/standard/filestat.c),php_stat() 中除了访问调用之外没有什么特别的事情发生。我现在很好奇,认为 bug 票现在是个不错的选择。
  • @SebastianKeßler 我希望其他人可以验证我首先看到的内容。有很多潜在的变量。但我想臭虫票是探索它们的地方,而不是在这里。谢谢!
【解决方案2】:

我没有找到一个简单的答案,所以我创建了一个新的PHP bug ticket 来更好地追踪问题。感谢您的所有意见!

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2016-10-15
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2012-11-17
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多