我想在 Uberspace 7 上使用 Ruby CGI 脚本,但在权限和安全设置方面遇到了一些问题,尤其是在使用 gems 时。如何使用自定义 gem 安装 CGI 脚本?
1 回答
首先,请注意 Uberspace 7 在 SELinux 上运行。这意味着 CGI 脚本文件~/html/
不仅必须是可执行的,而且还需要正确的 SELinux 上下文。在这种情况下,类型必须是httpd_sys_content_t
。
您可以使用以下命令查看 SELinux 上下文ls -lZ
:
$ 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
参数,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
现在 gems 的安装应该可以工作了:
$ gem install mygem
要在 CGI 脚本中使用 gems,请Gem.paths
在需要 gems 之前设置变量:
#!/usr/bin/ruby
Gem.paths = { 'GEM_PATH' => '/var/www/virtual/<USERNAME>/gem' }
require 'mygem'
(... rest of the script)
这是必需的,因为我们无法修改GEM_PATH
apache 进程的环境变量(即 set )。