我有一个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脚本,它似乎不会失败。
在成功和失败之间没有任何关于代码和/或文件系统的变化,所以这似乎是一个真正的间歇性失败。
这让我发疯了。任何人都知道可能会发生什么?
谢谢, 盖伦
答案 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
!!!
这里发生了什么。这是非常基本的代码。当然有人已经看过这个......
更新: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运行 - 现在它能够导航到符号链接的目录......