请让我解释一下这个问题的意思:
这是上下文:我是网络服务器上的用户,我有 phpicalendar
已安装;然后,我选择一个目录,比如 /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
)并渲染它们 - 到目前为止,一切都很好。问题是,我现在想添加第二个日历目录,它位于同一个网络服务器上,但我有只读权限,比如
/webroot/protected/cals
.我知道我有读取权限,因为我可以在 shell 中做,比如说$ less /webroot/protected/cals/maincal.ics
我可以很好地阅读内容..所以现在:
/webroot/protected/cals
作为“日历路径”,phpicalendar
可以毫无问题地读取和渲染那里的文件(例如,'maincal.ics
'、'maincal2.ics
')phpicalendar
只能有 一个 ' calendar_path
',所以我既可以使用 protected 日历,也可以使用我的自定义日历 - 但不能同时使用 所以,这是我会做的一个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
在外壳上工作 less relmaincal.ics
'relmaincal.ics: No such file or directory
失败' (即使在执行符号链接(symbolic link)命令期间,相对路径的 shell 自动完成功能确实有效!)phpicalendar
现在,它将呈现 mycal.ics
, mycal2.ics
和 testcal.ics
(他们会工作)现在 - 这可能是 PHP 无法解析符号链接(symbolic link);但是我推测情况是这样的:
less maincal.ics
- 它是 myself
谁是用户,拥有 /webroot/protected/cals
的读取权限phpicalendar
(因此 Apache 网络服务器用户)也可以访问 /webroot/protected/cals
作为只读,当给定“硬编码”路径时 phpicalendar
还能够很好地读取本地符号链接(symbolic link) 因此,我怀疑问题在于:当尝试读取 protected cals 的符号链接(symbolic link)时,在该操作期间对 shell 可见的用户是 Apache Web 用户,然后它没有获得访问 protected 符号链接(symbolic link)的权限/cals 位置!
现在的事情是 - 我可以轻松地在本地复制 .ics 文件;但是它们正在被其他人更改,这就是为什么我更喜欢符号链接(symbolic link)的原因。
还有我的问题 是:我可以做一些诡计,以便当 phpicalendar/Apache 尝试访问 protected /cals 的符号链接(symbolic link)时,它“认为”它是一个本地文件 - 否则, 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 下你希望能够访问它们的任何位置符号链接(symbolic link)到该位置。
关于Linux: 'transferring'/镜像符号链接(symbolic link)的只读权限(用于网络服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5180801/