从Ruby on Rails执行系统任务的最佳方法是什么?

时间:2008-11-04 10:43:52

标签: ruby-on-rails ruby setuid

我正在构建一个小型系统管理Web应用程序(想想Web-Min,但在RoR中),我需要能够从我的Ruby代码访问系统参数。例如,我想允许用户更改服务器的主机名,时区或网络配置。

我目前的想法是有一个单独的setuid脚本(Perl,Ruby,??),以便我可以从我的RoR代码调用它,它将执行操作。这非常麻烦而且不是很优雅。我是一个Ruby新手,想知道是否有更好的方法来完成这类事情。

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用BackgrounDRb。其目的是从rails应用程序卸载任务,您可以在不同的用户下运行服务器。

答案 1 :(得分:3)

有一系列RailsCasts集包含了后台任务。

最恰当的问题可能是"Rake in Background",这可能是一个很好的起点?顾名思义,它涵盖了从Ruby on Rails触发rake任务。

更改系统设置的最明显的解决方案是让守护程序以root身份运行,该守护程序接受一些(非常有限且严格消毒)的输入,例如新的主机名或服务器的新IP地址。其他剧集"Starling and Workling""Custom Daemon"也可以帮助解决这个问题。

更清洁的解决方案是使用sudo。有两种(类似的)方法可以解决这个问题:

允许sudo访问某些命令(例如hostnameifconfig)给将运行rake任务的用户。这可能会带来很大的安全问题。我最喜欢这样的例子是允许sudo访问vim,这似乎是无害的,直到你运行sudo vim,然后!bash,突然你通过文本编辑器对机器进行全权访问..

另一种方式(安全性更容易) - 具有执行所需任务的rake任务(或几个单独的脚本)(例如,更改主机名)。说,/usr/bin/myapp_systemtasks拥有root:root,然后允许sudo访问该脚本。确保您非常小心地清理脚本接受的输入(以防止shell转义)。

所以,有办法做到这一点,但最终你正在制作一个系统级配置的网络界面,这很难安全地做。无论你决定做什么,确保它是经过充分测试(由您和其他人)

答案 2 :(得分:0)

有人建议使用result = %x[uptime]这样的内容,并指出我very helpful blog post。我认为通过组合某种使用sudo调用的包装脚本并在sudoers中具有适当的权限,这是可行的。

答案 3 :(得分:0)

我已经使用Starling完成了类似的任务,它实际上只是一个排队服务器。它非常易于使用,您可以轻松地在不同的用户下运行工作线程。

starling的一个优点是它会记录队列,所以如果有问题,它可以重新创建队列。

require 'starling'
starling = Starling.new('127.0.0.1:22122')
starling.set('my_queue', 12345)

然后你的工作人员可以简单地将任何任务排队:

require 'starling'
loop do
  starling.get('my_queue') # this will block until something gets added to the queue
  # do stuff
end