【问题标题】:What is the user that actually write on disk in Ruby? Write error在 Ruby 中实际写入磁盘的用户是什么?写入错误
【发布时间】:2011-12-02 18:11:25
【问题描述】:

我有以下环境:

  • 我有一台带有nginxpassengerruby 1.9.2ror 3.*postgresql 的 Ubuntu 10.10 服务器(db 不在游戏中)
  • 我有一个位于/var/www/(示例文件夹)的应用程序
  • 我的机架用户是www-datanginx 也是用户)

    www-数据 21977 0.1 7.2 53324 44420 ? Sl Dec01 2:21 机架:/var/www/
    www-数据 1187 0.0 0.4 10620 2468 ? S Nov24 2:47 nginx:工作进程

  • 我的文件夹/var/www/public 属于www-data 并且在755

    drwxr-xr-x 7 www-data www-data 4096 2011-12-02 16:13 公开

我收到以下错误(相关部分):

Errno::EACCES in AnswerLinesController#export_csv
Permission denied - public/survey_70_result_csv.csv
app/controllers/answer_lines_controller.rb:647:in `initialize'
app/controllers/answer_lines_controller.rb:647:in `open'
app/controllers/answer_lines_controller.rb:647:in `export_csv'

然后我将我的文件夹 /public 转到 775,结果相同。 然后我将我的文件夹/public 转到777,工作! 为了好玩,我尝试再次将我的文件夹/public 转为755。它正在工作。

  1. Ruby(或 Ruby On Rails?)如何实际管理权限/权限?
  2. 是否有任何类型的权限或写入缓存?
  3. 在磁盘上写入的实际用户是谁? Ruby的用户? (在这种情况下,www-data?)
  4. 如何解释它首先在755 中不起作用,然后在777 中起作用,最后在755 中起作用的事实?谁在制造麻烦?会混淆的文件系统层或 Ruby 的写入磁盘模块?

还是 Ruby 中的错误?

【问题讨论】:

  • survey_70_result_csv.csv 的所有权和权限是什么?
  • 穆,这是个好问题,这是答案:-rw-r--r-- 1 www-data www-data 7962 2011-12-03 02:59survey_70_result_csv.csv跨度>

标签: ruby linux ruby-on-rails-3 file-io permissions


【解决方案1】:
  1. 管理权限的不是 Ruby 也不是 Rails。是乘客。 基本上,这取决于您如何配置乘客。如果它使用用户切换(我认为这是默认设置),那么它将在拥有文件 config/environment.rb(对于 Rails 应用程序)或 config.ru(对于 Rack 应用程序)的用户下运行,除非它已被覆盖配置。 您可以在http://modrails.com/documentation/Users%20guide%20Nginx.html#user_switching 上阅读更多相关信息
  2. 据我所知,文件系统中可能存在写入缓存,但在这种情况下不会影响权限。
  3. 见第一。
  4. 嗯,这是我的猜测:您是否在重试之前删除了文件?还是你改了文件名?如果不是,那么根据我对其工作原理的理解,该文件将已经具有尝试写入它的相同所有者,这意味着该进程可以对文件执行任何操作。只要进程有权写入文件,目录的实际权限就无关紧要。

(例如,如果您删除目录的读取权限,但将其保留为文件,用户将无法列出目录中的文件,但如果他知道完整的文件名,他仍然可以访问该文件)

【讨论】:

  • 我认为(4)是关键问题; AFAIK,覆盖现有文件只需要对文件的写访问权,但创建它需要对目录的写访问权。
  • 啊,这很有趣。谢谢吉米。回答第 4 点,我认为您可能是对的。我实际上确实删除了该文件,但随后我尝试重新创建相同的文件。这是成功的。然后我尝试 - 刚才 - 创建另一个文件,但它一直没有使用 755 权限。但它一直在使用 777 权限。我想我们已经结束了。我会看看你的用户切换链接,如果线程上有任何新信息,我会在这里发回。
【解决方案2】:

郑重声明,Jimmy 在 user_switching 上是对的。这基本上是一个用户权限问题(正如我所认为的),但无法解决。

事情是这样的:

来自Phusion-Passenger documentation关于默认用户值:“默认值为nobody。”

这解释了为什么我必须将我的公共/文件夹访问权限设置为 777 并且 775 不起作用。

我通过添加 server { } 块修改了我的 nginx 配置:

    passenger_user www-data;

然后重新启动整个过程,将我的公共/文件夹权限设置为 755,然后一切正常。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2012-08-18
    • 2013-06-21
    • 2010-11-08
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多