繁体   English   中英

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

[英]What's the best way to perform system tasks from Ruby on Rails?

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

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

谢谢!

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

有一系列RailsCasts插曲涵盖了后台任务。

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

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

较干净的解决方案是使用sudo 我可以想到两种(相似)的方法:

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

另一种方法(更容易安全地进行)-具有执行所需任务(例如,更改主机名)的rake任务(或一些单独的脚本)。 假设root:root拥有/usr/bin/myapp_systemtasks ,然后允许sudo访问该脚本。 确保非常小心地清理脚本接受的输入(以防止类似shell逃逸的情况)。

因此,有很多方法可以做到,但是到了最后,您将建立一个系统级配置的Web界面,这很难安全地进行。无论您决定做什么,都要确保它已经过良好的测试(由您和其他人)

有人建议使用诸如result = %x[uptime]并向我指出了这篇非常有用的博客文章 我认为这可以通过将某种包装器脚本与sudo结合使用,并在sudoers中具有适当的权限来实现。

我已经使用Starling完成了类似的任务, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM