首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解sudo与rvmsudo中的rubygems 'require‘

理解sudo与rvmsudo中的rubygems 'require‘
EN

Stack Overflow用户
提问于 2014-02-19 03:38:55
回答 1查看 344关注 0票数 0

我使用的是Ubuntu 12.04.4 TLS

我用/home/abdo/sample_serv.sh写了一个简单的shell脚本来执行Ruby文件:

代码语言:javascript
复制
#!/bin/bash
/home/abdo/.rvm/rubies/ruby-2.1.0/bin/ruby /home/abdo/sample_serv.rb

和包含以下代码的/home/abdo/sample_serv.rb

代码语言:javascript
复制
puts $:

require 'sinatra'

set :port, 8084

get '/' do
  %{ <html><body>Hello from Abdo</body></html> }
end

执行rvmsudo ./home/abdo/sample_serv.sh可以很好地工作,但我希望通过传递必要的环境变量来让sudo ./home/abdo/sample_serv.sh工作,因为我在使用upstart时遇到了问题。

问题出现在我的/etc/init/foo.conf

代码语言:javascript
复制
description "webserver test"

start on runlevel [23]
stop on shutdown

pre-start script
  exec >> /var/log/unicorn_test.log 2>&1
  echo starting
end script

script
  exec >> /var/log/unicorn_test.log 2>&1

  /bin/bash /home/abdo/.rvm/bin/rvmsudo /home/abdo/sample_serv.sh
  echo started
end script

当到达行/bin/bash /home/abdo/.rvm/bin/rvmsudo /home/abdo/sample_serv.sh时,我会得到

代码语言:javascript
复制
/home/abdo/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in 
`require': cannot load such file -- sinatra (LoadError)

我能够获得与我的用户相同的ruby -v,但是看起来GEM_PATH (即使我在upstart配置文件中设置了它)并没有帮助。

基本上,如果我能够理解rubygems如何查找所需的文件(以及在哪里-- gem env不起作用,因为当我执行sudo时,gem不是一个命令),那么我应该能够继续下一步。

EN

回答 1

Stack Overflow用户

发布于 2014-02-19 04:23:37

当你在sudo下运行时,你在一个不同的环境中运行,那里没有安装gem$PATH是不同的,所以事情可能不会顺利地运行。

您可能想尝试一下this

更改sudo的严格缺省值

如果你遇到这种情况,需要3件事来缓解它:

对于正在调用sudo的用户,必须在其shell环境中设置export rvmsudo_secure_path=0 (考虑.bashrc、.bash_profile或/etc/sudoers

  • add Defaults env_keep +="rvm_bin_path GEM_HOME IRBRC MY_RUBY_HOME rvm_path rvm_prefix rvm_version GEM_PATH rvmsudo_secure_path RUBY_VERSION rvm_ruby_string rvm_delete_flag"上的.zshrc)

  • comment

  • Defaults env_keep +="rvm_bin_path GEM_HOME IRBRC MY_RUBY_HOME rvm_path rvm_prefix rvm_version GEM_PATH rvmsudo_secure_path RUBY_VERSION rvm_ruby_string rvm_delete_flag" to /etc/sudoers在极少数情况下需要添加更多变量-这些变量应在第一次运行sudo时报告

在这些更改之后,您应该能够使用rvmsudo来保留与“普通”sudo调用相同的密码/无密码指令。

编辑

如果您不想更改默认值,可以尝试将上述环境值(rvm_bin_path GEM_HOME IRBRC MY_RUBY_HOME rvm_path rvm_prefix rvm_version GEM_PATH rvmsudo_secure_path RUBY_VERSION rvm_ruby_string rvm_delete_flag)的值同步到您的root用户。

如果这样不起作用,您可以尝试将rvm作为root安装,并使用该环境(而不是/home/abdo/.rvm/bin/rvm)来运行您的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21863701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档