0

json と rinku の 2 つの gem を要求しようとしています。

私はホストされた Linux ボックスで作業しており、root/sudo アクセス権がなく、ホーム ディレクトリに gem がインストールされてしまいました。

-jailshell-3.2$ gem which json
/home/cygnetrc/ruby/gems/gems/json-1.7.3/lib/json.rb
-jailshell-3.2$ gem which rinku
/home/cygnetrc/ruby/gems/gems/rinku-1.5.1/lib/rinku.rb

Ruby のバージョンは次のとおりです。

-jailshell-3.2$ ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]

RubyGems 環境は次のとおりです。

  - RUBYGEMS VERSION: 1.8.11
  - RUBY VERSION: 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/cygnetrc/ruby/gems
  - RUBY EXECUTABLE: /usr/bin/ruby
  - EXECUTABLE DIRECTORY: /home/cygnetrc/ruby/gems/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /home/cygnetrc/ruby/gems
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
     - "gempath" => []
     - "gem" => "--remote --gen-rdoc --run-tests"
     - "gemhome" => "/home/cygnetrc/ruby/gems"
     - "rdoc" => "--inline-source --line-numbers"
  - REMOTE SOURCES:
     - http://rubygems.org/


-jailshell-3.2$ ruby -e 'puts $:'
/usr/lib/ruby/site_ruby/1.8
/usr/lib/ruby/site_ruby/1.8/x86_64-linux
/usr/lib/ruby/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/x86_64-linux
.

以下を使用して宝石を含めようとしました:

-jailshell-3.2$ head gettweets.rb 
#!/usr/bin/ruby 

require 'rubygems'
require 'json'
require 'net/https'
require 'uri'
require 'rinku'

しかし、最終的には次のようになります。

-jailshell-3.2$ ./gettweets.rb 
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- json (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
        from ./gettweets.rb:7

広範囲に調べたところ、RUBYOPTS などのさまざまなパス変数に関する多くの情報が見つかりましたが、何も機能していないようです。

問題をさらに複雑にするために、cron ジョブからスクリプトを呼び出すので、使用するソリューションは、.profile などのホーム ディレクトリ内の変更に依存することはできません。

髪を引っ張っています - 誰か助けてくれますか?


アップデート:

ご意見ありがとうございます!あなたのアドバイスのいくつかに従ってGEM_PATH、シェル環境変数として設定してエクスポートすると、どの機能が機能するかを読みました。ただし、cron からスクリプトを実行したいので、スクリプト自体から設定できるようにする必要があります。私はこれをやろうとしましたが、うまくいかないようです。さらに考えはありますか?

-jailshell-3.2$ ruby -I ~/ruby/gems ./gettweets.rb 
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- json (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
        from ./gettweets.rb:4
-jailshell-3.2$ head -20 ./gettweets.rb 
#!/usr/bin/ruby 

require 'rubygems'
require 'json'
require 'net/https'
require 'uri'
require 'rinku'
require 'optparse'

OptionParser.new do |o|
  o.on('-d', "Turn on debugging messages") { |b| $debug = b }
  o.on('-h', "Print this help screen") { puts o; exit }
  o.parse!
end

puts "[*] Starting..." if $debug

# Setenv to catch json gem
ENV['GEM_PATH'] = '~/ruby/gems'
puts "ENV " + ENV['GEM_PATH'] if $debug
-jailshell-3.2$ export GEM_PATH=~/ruby/gems
-jailshell-3.2$ ruby ./gettweets.rb  -d
[*] Starting...
ENV ~/ruby/gems
[*] Filepath = /home/cygnetrc/www/drupal/tweets.html
The queens of the women's single sculls - a look back at the Olympic history: http://t.co/d0YmNr40 #rowing #wr #London2012 #Olympics<br />
<em>Fri Jun 08 16:05:38</em><br />
1 week until #WRCMunich! NZL's Storm Uru will be racing the LM2x with @petertaylorNZ. Here, Uru talks about teamwork: http://t.co/NvjRgtwW<br />
<em>Fri Jun 08 14:38:02</em><br />
The 2012 @Paralympic Games Qualification Process is complete: http://t.co/D6DRG0bO #rowing #adaptive #Paralympic #London2012 #wr<br />
<em>Fri Jun 08 13:23:14</em><br />
true
[*] Finished
-jailshell-3.2$ 
4

1 に答える 1

0

Apache mod_cgi を介して Ruby を実行すると、同様の問題が発生しました。環境変数は設定されていませんが、CGI スクリプトは Apache ではなくユーザーとして実行されます。これが私の回避策でした。

#!/bin/bash
source "/home/username/.bashrc"
rubyscript.cgi

しかし、このような回避策を回避するために、Ruby スクリプト自体の gems パスに追加する実際の方法が必要であり、これを見つけました。

ENV["HOME"] = "/home/user"
ENV["GEM_HOME"] = ENV["HOME"] + "/ruby/gems"
ENV["GEM_PATH"] = ENV["GEM_HOME"] + ":/usr/lib/ruby/gems/1.8"
ENV["GEM_CACHE"] = "GEM_HOME/cache"
ENV["PATH"] = ENV["PATH"] + ":" + ENV["HOME"] + "/ruby/gems/bin"

これは、Ruby スクリプトの先頭に配置するか、ファイルに配置して先頭に「必須」にすることができます (environment.rb など)。

ENV["HOME"] = "/home/user"
ENV["GEM_HOME"] = ENV["HOME"] + "/ruby/gems"
ENV["GEM_PATH"] = ENV["GEM_HOME"] + ":/usr/lib/ruby/gems/1.8"
ENV["GEM_CACHE"] = "GEM_HOME/cache"
ENV["PATH"] = ENV["PATH"] + ":" + ENV["HOME"] + "/ruby/gems/bin"

ruby.cgi:

#!/usr/bin/ruby
require "environment"
require "rubygems"
require "json"
puts "Content-type: text/json"
puts ""
puts "{'bacon':['yum','tasty']}"
于 2013-02-09T08:36:07.203 に答える