1

次のapp.rbRuby アプリケーションを用意します。

#!/usr/local/Cellar/rbenv/0.3.0/versions/1.9.3-p194/bin/ruby

require 'rubygems'
require 'sinatra'

get '/pwd' do
  `pwd`
end

次のようなコマンドを使用して、Webサーバーとして起動できます。

  • ./Users/doug/code/backdore/app.rb
  • ruby /Users/doug/code/backdore/app.rb
  • /usr/local/Cellar/rbenv/0.3.0/versions/1.9.3-p194/bin/ruby /Users/doug/code/backdore/app.rb

次に、Web クライアントを使用して GET を実行すると、コマンドを開始した場所からの現在のパスhttp://localhost:4567/pwdが返されます。/Users/doug/code/backdore

サーバーを停止し、Users/doug/code/フォルダーからコマンドを再度実行すると、サーバーから返されるパスは次のようになります/Users/doug/code

私の質問は次のとおりです。この Web サーバーをchrootしたいので、コマンドの前に次のようなプレフィックスを付ける必要があります。

sudo chroot /Users/doug/code/backdore /usr/local/Cellar/rbenv/0.3.0/versions/1.9.3-p194/bin/ruby "app.rb"

ただし、これは機能せず、次のエラー メッセージが表示されます。

chroot: /usr/local/Cellar/rbenv/0.3.0/versions/1.9.3-p194/bin/ruby: そのようなファイルやディレクトリはありません

私は Mac OS X で作業していますが、これは Ubuntu でも同様のはずです。/Users/doug/code/backdoreサーバーから' ' のみを表示するには、このサーバーを ' ' 内で chroot するにはどうすればよい/ですか?

編集

chroot 内に Ruby インタープリターを配置するために、mrubyをインストールして、このスクリプトでいくつかのテストを行いました...

$ cat test/script.rb
loop do
  puts "hello world"
end

私の現在の場所は次のとおりです。

$ pwd
/Users/doug/code/mruby

したがって、スクリプトをテストするためだけに、

$ bin/mruby test/script.rb
hello world
hello world
hell^C

それはうまくいっています。しかし、これを次のようにchrootしようとすると:

$ chroot /Users/doug/code/mruby bin/mruby test/script.rb
chroot: /Users/doug/code/mruby: Operation not permitted

そして、私がこのようにしようとすると:

$ sudo chroot /Users/doug/code/mruby bin/mruby test/script.rb
Password:
~/code/mruby ‹1.9.3-p194›  ‹master*› $

何も起こりません (無限ループになるはずです)。

助けてくれてありがとう。

4

1 に答える 1

3

chrootでプロセスを実行する場合、プロセスで使用されるすべてのバイナリ、ライブラリ、およびその他のファイルは、新しいルートディレクトリで使用できる必要があります。/usr/local/Cellar下に存在しないため(/Users/doug/code/backdoreたとえば/Users/doug/code/backdore/usr/local/Cellar)、コマンドexecによる実行は失敗します。chroot

正直なところ、chrootでRubyアプリケーションを実行しようとすると、大量のライブラリ(Rubyとそれ以外の両方)が必要になるため、かなり苦痛になります。ライブラリの問題のほとんどを回避できるため、起動後にプロセス自体をchrootする方がよい場合があります。

于 2012-10-30T18:24:02.393 に答える