如何在Ruby on Rails中执行系统任务的最佳方法是什么?

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

我的当前想法是编写一个单独的setuid脚本(Perl、Ruby等),以便可以从我的RoR代码中调用它并执行操作。这相当繁琐且不太优雅。作为Ruby的新手,我想知道是否有更好的方法来完成这种事情。

谢谢!

4个回答

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

这些是很棒的信息,但我不确定它是否能解决我的问题。这些任务不会持续太长时间,也不需要在后台运行。而且单独运行一个服务器只为了处理主机重命名有点过度杀伤力。 - Richard Hurt
即使有些过度,但这是在Rails应用程序中将作业分配给另一个用户的最简单方法。虽然这不是插件的主要目的,但它可以干净、漂亮地完成工作。 - changelog

3

有一系列RailsCasts的视频涵盖了后台任务。

可能最适合你的问题的是"Rake in Background",这可能是一个很好的起点?正如名称所示,它涵盖了从Ruby on Rails触发rake任务。

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

更清洁的解决方案是使用sudo。我可以想到两种(类似的)方法:

允许用户对某些命令(例如hostnameifconfig)进行sudo访问以运行rake任务。这可能会带来很大的安全问题。我最喜欢的例子是允许sudo访问vim,它看起来无害,直到你运行sudo vim,然后运行!bash,突然之间你就可以通过文本编辑器完全掌控机器了。

另一种方法(更容易实现安全性)-编写一个rake任务(或几个单独的脚本),执行所需的任务(例如更改主机名)。比如,/usr/bin/myapp_systemtasksroot:root拥有,然后允许sudo访问该脚本。请务必非常小心地清理该脚本接受的输入(以防止像shell-escaping这样的事情发生)。

因此,有方法可以做到这一点,但归根结底,您正在为系统级配置创建Web界面,这非常难以确保安全。无论您决定采取何种措施,请确保经过充分的测试(由您和其他人)。


0

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接