如何在Uberspace上使用Ruby CGI脚本

时间:2018-10-01 13:59:05

标签: ruby rubygems cgi uberspace

我想在Uberspace 7上使用Ruby CGI脚本,但是在权限和安全设置方面遇到了几个问题,尤其是在使用gem时。如何安装带有自定义gem的CGI脚本?

1 个答案:

答案 0 :(得分:1)

首先,请注意,Uberspace 7在SELinux上运行。这意味着~/html/中的CGI脚本文件不仅必须是可执行文件,而且还需要正确的SELinux上下文。在这种情况下,类型必须为httpd_sys_content_t

您可以使用ls -lZ查看SELinux上下文:

$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

如果某些文件具有错误的上下文,则可以使用restorecon命令来恢复上下文,例如restorecon -R ~/html/

Ruby gems的用户安装目录为~/.gem/。在Uberspace上,gem install默认安装到该目录:

$ cat /etc/gemrc
gem: --no-document --user-install

由于主目录无法通过apache进程访问,因此无法从CGI脚本执行安装在那里的gem。您可以在/var/www/virtual/$USER/gem中安装gems,而使用创建目录

$ mkdir /var/www/virtual/$USER/gem

您不能直接将--install-dir的{​​{1}}参数用于gem install,因为它与上述默认参数冲突:

$ gem install mygem --install-dir /var/www/virtual/$USER/gem
ERROR:  Use --install-dir or --user-install but not both

相反,使用以下内容创建~/.gemrc来覆盖默认参数(用您的实际用户名替换<USERNAME>):

gem: --install-dir /var/www/virtual/<USERNAME>/gem

现在可以安装gem了:

$ gem install mygem

要在CGI脚本中使用gem,请在需要gem之前设置Gem.paths变量:

#!/usr/bin/ruby

Gem.paths = { 'GEM_PATH' => '/var/www/virtual/<USERNAME>/gem' }

require 'mygem'

(... rest of the script)

这是必需的,因为我们无法为apache进程修改环境变量(即,设置GEM_PATH)。