请让我解释一下我的意思是什么:

这是上下文:我是安装了phpicalendar的Web服务器上的用户;然后,我选择一个目录,说/webroot/mylogin/phpicalendar/mycals来承载我的.ics日历文本文件。

编辑:以前,我不是使用'/webroot'而是使用'/root'-但我的确不是Linux'/root'目录的意思-我只是想将其用作替代品网络服务器上的实际位置(因此它只是一个共同的参考点)。否则,我的共同参考点就是/webroot = /media/some/path ..

然后,我可以在phpicalendarconfig.inc.php中输入此目录:

$configs = array(
 'calendar_path'        => '/webroot/mylogin/phpicalendar/mycals;
 ...


然后,phpicalendar将遍历此目录,在其中抓取.ics文件(例如mycal.icsmycal2.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.icsmycal2.icstestcal.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/

10-13 05:18