【问题标题】:Ruby: Could not find a temporary directoryRuby:找不到临时目录
【发布时间】:2014-01-14 15:55:38
【问题描述】:

我的 Passenger Rails 应用程序出现大约 500 个错误。查看日志时,乘客似乎无法访问 /tmp 目录。我已经验证它在那里并且具有对 root 的 RW 访问权限,然后尝试了 www-data。这是怎么回事?

 2014-01-14 16:01:16.6573 20624/7fa7c8806700 Pool2/SmartSpawner.h:301 ]: Preloader for /var/www/socialrest_homepage started on PID 20686, listening on unix:/tmp/passenger.1.0.20618/generation-0/backends/preloader.20686
App 20704 stdout: 
[Tue Jan 14 16:01:17 2014] [error] [client 168.215.171.129] Premature end of script headers: 
App 20686 stderr: /usr/local/rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/tmpdir.rb:34:in `tmpdir': could not find a temporary directory (ArgumentError)
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/utils/tmpio.rb:17:in `new'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/utils/tee_input.rb:99:in `initialize'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/rack/thread_handler_extension.rb:55:in `new'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/rack/thread_handler_extension.rb:55:in `process_request'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
App 20686 stderr:   from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.33/lib/phusion_passenger/request_handler.rb:440:in `block (3 levels) in start_threads'
[ 2014-01-14 16:01:21.0163 20624/7fa7cb242700 Pool2/Pool.h:776 ]: Process (pid=20704, group=/var/www/socialrest_homepage#default) no longer exists! Detaching it from the pool.
App 20720 stdout:

这是我当前的 /tmp 和 config/environment.rb 所有权:

drwxrwxrwx   5 root root 4.0K Jan 14 16:01 tmp

-rwxr-xr-x  1 root root  196 Jan 13 20:06 environment.rb

【问题讨论】:

    标签: ruby tmp


    【解决方案1】:

    堆栈跟踪中最重要的部分是错误消息:

    could not find a temporary directory (ArgumentError)
    

    当您告诉 Ruby >= 2.0 创建一个临时文件时,它会寻找一个可以安全地创建文件的目录。在您处理该文件时任何人都可以替换该文件的目录中创建一个临时文件将是一个大(且常见)的安全漏洞!

    你有两种可能:

    • 通过将环境变量 TMPDIR 或 TMP 或 TEMP 之一设置为安全目录,告诉 ruby​​ 可以在哪里安全地创建临时文件。

    • 修复 ruby​​ 尝试使用的目录的权限。 Ruby 尝试使用的目录:systempdir ("/tmp") 和当前目录

    如果目录不是全局可写的或设置了粘性位,Ruby 认为该目录是安全的。 (不要将粘滞位 (t) 与 seteuid/setgid 位 (s) 混淆!)

    因此,您可以不设置 TMPDIR,而是让您的工作目录不可全局写入,或​​者这样做:

    chmod +t /tmp
    

    chmod的手册页解释了sticky bit的使用:

    [It] 防止非特权用户删除或重命名目录中的文件,除非他们拥有文件或目录;这称为目录的限制删除标志,通常在 /tmp 等全局可写目录中找到。

    以下是没有粘性位的情况:https://security.stackexchange.com/questions/9115/can-you-describe-a-real-life-scenario-of-exploiting-sticky-bits/108666#108666

    另见:https://blog.diacode.com/fixing-temporary-dir-problems-with-ruby-2

    【讨论】:

    • 是的,就是这样。 777 不行。如果您在 /tmp 目录上执行 777,则可以使用建议的 chmod +t /tmp @hagello 修复此问题。
    【解决方案2】:

    不确定这里发生了什么,但我相信它与 /tmp 文件夹权限有关。我认为我的 /tmp 文件夹已损坏,所以我四处寻找删除该文件夹并恢复它(我不确定这个文件夹是否对它的创建方式特别重要)。我发现 this source 建议您可以像创建任何其他文件夹一样简单地创建 /tmp 文件夹,然后在新创建的文件夹上执行 chmod 1777

    所以,我没有删除我当前的 /tmp,而是运行了这个 chmod 命令,一切似乎都正常了。

    让我感到奇怪的是,我之前做过chmod 777,这导致文件夹无法工作。奇怪...

    【讨论】:

    • 救命稻草。仅在用户测试开始之前针对某些页面点击此问题。第一个结果是 bing 并立即解决。感谢分享
    • chmod 777 /tmp 从目录中删除粘性位。没有粘性位,任何人都可以随时从目录中删除、重命名或替换文件。这是一个严重的安全问题。
    • 解释为什么chmod 777 /tmp 是个坏主意:security.stackexchange.com/questions/9115/…
    【解决方案3】:
    ls -l /
    
    $drwxrwxrw   9 root     root      4096 Jun 26 11:34 tmp
    

    如果您在权限列 '/tmp' 的末尾没有看到 t

    chmod o+t /tmp
    chmod 1777 /tmp    
    $ ls -l / 
    drwxrwxrwt   9 root     root      4096 Jun 26 11:35 tmp
    

    原因是Fixing temporary dir problems with Ruby 2

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2021-02-22
      • 2015-08-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多