请让我解释一下我的意思是什么:
这是上下文:我是安装了phpicalendar
的Web服务器上的用户;然后,我选择一个目录,说/webroot/mylogin/phpicalendar/mycals
来承载我的.ics
日历文本文件。
编辑:以前,我不是使用'/webroot
'而是使用'/root
'-但我的确不是Linux'/root
'目录的意思-我只是想将其用作替代品网络服务器上的实际位置(因此它只是一个共同的参考点)。否则,我的共同参考点就是/webroot = /media/some/path
..
然后,我可以在phpicalendar
的config.inc.php
中输入此目录:
$configs = array(
'calendar_path' => '/webroot/mylogin/phpicalendar/mycals;
...
然后,
phpicalendar
将遍历此目录,在其中抓取.ics文件(例如mycal.ics
和mycal2.ics
)并进行渲染-到目前为止,一切都很好。关键是,我现在想添加第二个日历目录,该目录位于同一台Web服务器上,但是我拥有只读权限,例如
/webroot/protected/cals
。我知道我具有读取权限,因为我可以在外壳中执行此操作,例如$ less /webroot/protected/cals/maincal.ics
我可以很好地阅读内容。
如果输入
/webroot/protected/cals
作为“ calendar_path”,则phpicalendar
可以在那里读取和呈现文件(例如,“ maincal.ics
”,“ maincal2.ics
”)但是,
phpicalendar
只能有一个'calendar_path
',因此我可以使用受保护的日历,也可以使用我的自定义日历-但不能同时使用两者因此,我想,我可以将受保护的日历链接到我的自定义目录中,从而获得两全其美的效果:)
所以,这是我会做的一个shell片段
$ cd /webroot/mylogin/phpicalendar/mycals
$ ls -la
drwxrwxrwx 2 myself myself 4096 2011-03-03 12:50 .
-rw-r--r-- 1 myself myself 1234 2011-01-20 07:32 mycal.ics
-rw-r--r-- 1 myself myself 1234 2011-01-20 07:32 mycal2.ics
...
$ ln /webroot/protected/cals/maincal.ics . # try a hard link first
ln: creating hard link `./maincal.ics' => `/webroot/protected/cals/maincal.ics': Invalid cross-device link'
$ ln -s /webroot/protected/cals/maincal.ics . # symlink - works
$ ln -s ../../../protected/cals/maincal.ics relmaincal.ics # symlink via relative
$ ln -s mycal.ics testcal.ics # try a symlink to a local file
$ ls -la # check contents of dir now
drwxrwxrwx 2 myself myself 4096 .
-rw-r--r-- 1 myself myself 1234 mycal.ics
-rw-r--r-- 1 myself myself 1234 mycal2.ics
lrwxrwxrwx 1 myself myself 21 testcal.ics -> mycal.ics
lrwxrwxrwx 1 myself myself 56 maincal.ics -> /webroot/protected/cals/maincal.ics
lrwxrwxrwx 1 myself myself 66 relmaincal.ics -> ../../../protected/cals/maincal.ics
好的,这就是发生的情况:
less maincal.ics
在shell上工作less relmaincal.ics
失败,并显示“ relmaincal.ics: No such file or directory
”(即使相对路径的外壳自动补全在执行symlink命令期间起作用了!)现在打开
phpicalendar
时,它将渲染mycal.ics
,mycal2.ics
和testcal.ics
(它们将起作用)但是,不会解析或显示maincal.ics和relmaincal.ics
现在-这可能是PHP无法解析符号链接。但是我推测情况是这样的:
当我执行
less maincal.ics
时-是myself
谁是用户,谁拥有对/webroot/protected/cals
的读取权限在给定“硬编码”路径的情况下,
phpicalendar
(因此Apache Web服务器用户)也可以只读方式访问/webroot/protected/cals
phpicalendar
也能够读取本地符号链接因此,我怀疑问题是:当尝试读取到受保护的cal的符号链接时,在该操作过程中外壳程序可见的用户是Apache Web用户,因此该用户没有获得访问到受保护的符号链接的权限。 / cals位置!
现在的事情是-我可以轻松地在本地复制.ics文件;但是它们正在被其他人更改,这就是为什么我更愿意使用符号链接。
我的问题是:我可以做些魔术吗,以便当phpicalendar / Apache尝试访问符号链接到protected / cals时,它“认为”它是本地文件-否则,protected / cals的内容文件正在“管道”回phpicalendar / Apache?我想我在考虑以下方面的问题:
$ mkfifo mypipe
$ ln -s mypipe testpipe.ics
$ cat ./testpipe.ics # in one terminal
$ cat /webroot/protected/cals/maincal.ics > mypipe # in other terminal
...否则会(我认为)处理权限问题-除此之外,我不想手动
cat
;每次应用程序请求读取testpipe.ics
时,都必须在后台完成该操作:)好吧,在此先感谢您的任何评论-希望听到一些声音,
干杯!
最佳答案
嗯,我真的怀疑Web服务器运行的帐户是否可以读取/root
下的任何内容。该目录通常是模式0700,用户root,组root或与之非常相似的文件-表示不允许非root用户访问。如果您以root用户身份运行Web服务器,则文件读取权限是您遇到的最少问题...
最好的选择是将只读日历文件放置在公共可用的位置,并从您希望能够访问它们的/ root下的任何位置符号链接到该位置。
关于linux - Linux:“转移”/镜像符号链接(symbolic link)的只读权限(对于Web服务器),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5180801/