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