Linux: 'transferring'/镜像符号链接(symbolic link)的只读权限(用于网络服务器)

标签 linux webserver file-permissions pipe symlink

请让我解释一下这个问题的意思:

这是上下文:我是网络服务器上的用户,我有 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.icsmycal2.ics )并渲染它们 - 到目前为止,一切都很好。

问题是,我现在想添加第二个日历目录,它位于同一个网络服务器上,但我有只读权限,比如 /webroot/protected/cals .我知道我有读取权限,因为我可以在 shell 中做,比如说
$ less /webroot/protected/cals/maincal.ics

我可以很好地阅读内容..所以现在:
  • 如果我输入 /webroot/protected/cals作为“日历路径”,phpicalendar可以毫无问题地读取和渲染那里的文件(例如,'maincal.ics'、'maincal2.ics')
  • 但是,phpicalendar只能有 一个 ' calendar_path ',所以我既可以使用 protected 日历,也可以使用我的自定义日历 - 但不能同时使用
  • 所以,我想,我可以在我的自定义目录中对 protected 日历进行符号链接(symbolic link) - 并获得两全其美 :)

  • 所以,这是我会做的一个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.icstestcal.ics (他们会工作)
  • 但是,maincal.ics 和 relmaincal.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/

    相关文章:

    python - linux下如何获取接口(interface)的IPv6地址

    linux -/dev/tcp 在 LINUX 中不存在

    linux - 如何在基于 Unity 的 Linux 构建中设置默认命令行参数

    python - 开发 Web 服务器与生产 Web 服务器的距离有多近?

    Ansible 剧本 - 权限被拒绝

    google-app-engine - 如何为谷歌云应用程序版本添加可写权限?

    作为服务启动时,Java 应用程序无法正常工作

    apache - sonarqube 升级 5.2 -> 5.6 后,WebServer 不再运行

    python - 无法显示图像网络服务器python

    php - Apache+PHP在unix上写权限