5

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

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

谢谢!

4

4 回答 4

3

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

于 2008-11-04T10:55:26.017 回答
3

有一系列涵盖后台任务的RailsCasts剧集。

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

更改系统设置最明显的解决方案是让守护进程以 root 身份运行,它接受一些(非常有限且经过严格清理的)输入,例如新主机名或服务器的新 IP 地址。另一个剧集“Starling and Workling”“Custom Daemon”也可能对此有所帮助。

更清洁的解决方案是使用sudo. 我能想到两种(类似的)方法来做到这一点:

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

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

所以,有办法做到这一点,但归根结底,您正在为系统级配置创建一个 Web 界面,这很难安全地完成。无论您决定做什么,请确保它经过良好测试(由您和其他人)

于 2008-11-04T13:43:06.707 回答
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
于 2008-11-05T15:52:02.093 回答
0

一个人建议使用类似的东西result = %x[uptime]并将我指向这篇非常有用的博客文章。我认为这可以通过结合使用 sudo 调用并在 sudoers 中具有适当权限的某种包装脚本来实现。

于 2008-11-04T12:18:42.527 回答