用于Ruby进程的Chroot命令

时间:2012-10-30 18:09:40

标签: linux unix ubuntu sinatra chroot

拥有以下app.rb Ruby应用程序:

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

require 'rubygems'
require 'sinatra'

get '/pwd' do
  `pwd`
end

我可以使用如下命令启动它作为网络服务器:

  • ./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

然后,使用webclient,http://localhost:4567/pwd上的GET可以返回/Users/doug/code/backdore,这是我开始命令的当前路径。

如果我停止服务器,并再次执行来自Users/doug/code/文件夹的命令,那么从服务器返回的路径将是:/Users/doug/code

我的问题如下,因为我想 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*› $

并且什么也没发生(它应该是一个无限循环)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

在chroot下运行进程时,进程使用的二进制文件,库和其他文件的全部必须在其新的根目录下可用。由于/usr/local/Cellar下不存在/Users/doug/code/backdore例如,/Users/doug/code/backdore/usr/local/Cellar!),exec命令运行的chroot失败

尝试在chroot下运行Ruby应用程序将非常痛苦,老实说,因为它最终需要大量的库(Ruby和其他)。你可能最好在启动后让你的进程自己chroot,因为这将绕过大多数库问题。