Snow Leopard安装目录偶尔会更改权限

时间:2010-06-14 19:59:22

标签: php apache macos

我有一个smb安装目录: /卷/ myshare的

这是通过Finder“连接到服务器...”与smb:// myservername / myshare

一起安装的

到目前为止一切都很好。

然而,当我尝试通过PHP(在Apache下运行)访问目录时,它失败了,大约有10%的时间被拒绝。我的意思是重复访问我的页面有时会导致失败。我的PHP页面如下:


<?php
  $cmd = "ls -la /Volumes/ 2>&1";
  exec($cmd, $execOut, $exitCode);
  echo "<PRE>EXIT CODE = $exitCode<BR/>";
  foreach($execOut as $line) {
    echo "$line <BR/>";
  }
  echo "</PRE>";
?>

如果成功,它看起来像:


EXIT CODE = 0
total 40 
drwxrwxrwt@  4 root   admin    136 Jun 14 12:34 . 
drwxrwxr-t  30 root   admin   1088 Jun  4 13:09 .. 
drwx------   1 galen  staff  16384 Jun 14 09:28 myshare 
lrwxr-xr-x   1 root   admin      1 Jun 11 16:05 galenhd -> / 

当它失败时,它看起来像:


EXIT CODE = 1
ls: myshare: Permission denied 
total 8 
drwxrwxrwt@  4 root  admin   136 Jun 14 12:34 . 
drwxrwxr-t  30 root  admin  1088 Jun  4 13:09 .. 
lrwxr-xr-x   1 root  admin     1 Jun 11 16:05 galenhd -> / 

其他信息:

我正在使用PHP(5.3.1)和与Snow Leopard一起开箱的Apache服务器。

另外,如果我编写一个循环并从命令行重试“ls -la ..”的PHP脚本,它似乎不会失败。

在成功和失败之间没有任何关于代码和/或文件系统的变化,所以这似乎是一个真正的间歇性失败。

这让我发疯了。任何人都知道可能会发生什么?

谢谢, 盖伦

4 个答案:

答案 0 :(得分:1)

我的感觉是,它可能与SMB服务器无关,因为从命令行手动运行时无法重现。换句话说,它似乎只在通过网络运行时失败(即,当访问Apache页面时)。

所以它看起来像是某种形式的apache或“apache下的PHP”错误......

现在我看到该页面陷入“拒绝许可”状态。换句话说,它在第一次失败后仍然失败。我还发现了一系列重现步骤,并退出“允许拒绝”状态:

1)反复点击PHP页面直到失败(失败后仍然“失败”)

2)一旦失败,在命令行上执行ls /Volumes将失败。

3)执行sudo ls /Volumes确实有效(即root可以查看目录)。尝试ls作为普通用户仍然会失败...

4)然而(这是有趣的部分)在实际修复安装时执行sudo ls -l /Volumes。换句话说,在此命令之后,PHP和命令行作为普通用户再次开始工作。

<强>结论吗

所以看起来它通过PHP / apache访问挂载点(参见上面的代码)会破坏挂载,更改权限,从而锁定用户。 然后root可以通过发出sudo ls -l /Volumes !!!

来恢复权限

这里发生了什么。这是非常基本的代码。当然有人已经看过这个......



也许这是相关的? https://superuser.com/questions/100746/osx-10-6-give-apache2-readwrite-access-to-mounted-windows-share/152473#152473


更新:2010-06-15:将我的机器更新为10.6.4,声称有助于解决SMB安装问题。但是,这并没有解决我所看到的问题。看起来越来越像一个apache问题...


更新时间:2010-06-16 : 如果代码更改为:
$cmd = "ls -a /Volumes/ 2>&1";
(删除-l选项)它不会失败。换句话说,“ - l”标志导致失败发生......


UPDATE2:2010-06-16 : 既然它看起来像一个Apache(在Mac上?)的问题,我已经发布到Apache论坛: http://forums.digitalpoint.com/showthread.php?t=1839935

答案 1 :(得分:0)

您可以查看此SMB服务器的日志吗?它显示为SMB错误,而不是您的错误。

答案 2 :(得分:0)

我同意我的IT人员,我几乎肯定这不是SMB问题。我知道这一点,因为当我运行tcpdump时,在故障期间没有网络通信。换句话说,正在发生的事情是:

1)Apache以不好的方式更改文件系统的权限(即更改mount dir的权限)。

2)即使在访问SMB之前,未来在OS /文件系统级别访问挂载的尝试也会失败。

3)可以通过sudo ls -la /Volumes技巧恢复文件系统权限。

答案 3 :(得分:-1)

也许不是答案,而是更多的数据。在研究类似问题时我到了这个页面。当我以用户身份登录以在/ Volumes上安装NAS卷(FileShare)时,我的Mac运行Automator脚本。我尝试将FileShare符号链接到/ Library / WebServer / Documents中,并且在启用WebSharing后由于权限而无法浏览它(403错误)。权限看起来很好(755)。

做了一些研究,发现httpd进程是作为_www用户运行的(来自终端的ps -ef)。尝试将我的符号链接导演视为_www(sudo -i -u _www ls FileShare)显示_www用户收到了Permission denied。

我最终没有修复权限(似乎没什么用),而是转到/ etc / apache2并修改了httpd.conf以使httpd服务器以用户(人员)而不是_www(_www)运行(在用户下) /组设置)。

停止并重新启动Web服务器使其现在以User而不是_www运行 - 现在它能够导航到符号链接的目录......