Ruby:无法找到临时目录

Cla*_*lby 11 ruby tmp

我的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:
Run Code Online (Sandbox Code Playgroud)

这是我当前的/ 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
Run Code Online (Sandbox Code Playgroud)

hag*_*llo 24

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

could not find a temporary directory (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

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

你有两个可能性:

  • 通过将其中一个环境变量TMPDIR或TMP或TEMP设置为安全的目录,告诉ruby可以安全地创建临时文件的位置.

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

如果目录不是可写入的,或者设置了粘滞位,Ruby认为目录是安全的.(不要将sticky bit(t)与seteuid/setgid位混淆(s)!)

因此,您可以将工作目录设置为不可写入或执行以下操作,而不是设置TMPDIR:

chmod +t /tmp
Run Code Online (Sandbox Code Playgroud)

chmod的手册页解释了粘滞位的使用:

[它]防止非特权用户删除或重命名目录中的文件,除非他们拥有该文件或目录; 这称为目录的受限删除标志,通常位于世界可写目录,如/ 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,则可以使用 @hagello 建议的 `chmod +t /tmp` 解决此问题。 (2认同)

Cla*_*lby 18

不确定这里发生了什么,但我认为它与/ tmp文件夹权限有关.我以为我的/ tmp文件夹已损坏所以我四处查看删除该文件夹并恢复它(我不确定这个文件夹是否对它的创建方式特别重要).我发现这个源代码建议您只需创建/ tmp文件夹,就像使用任何其他文件夹一样,然后chmod 1777对新创建的文件夹执行操作.

因此,我没有删除当前的/ tmp,而是运行了这个chmod命令,一切似乎都有效.

对我来说很奇怪的是,我之前做过一次chmod 777,这导致文件夹无法正常工作.奇怪的...


Alb*_*ing 5

ls -l /

$drwxrwxrw   9 root     root      4096 Jun 26 11:34 tmp
Run Code Online (Sandbox Code Playgroud)

如果您在权限列“/tmp”的末尾没有看到那个 t

chmod o+t /tmp
chmod 1777 /tmp    
$ ls -l / 
drwxrwxrwt   9 root     root      4096 Jun 26 11:35 tmp
Run Code Online (Sandbox Code Playgroud)

原因是修复 Ruby 2 的临时目录问题