我正在构建一个小型系统管理 Web 应用程序(想想 Web-Min,但在 RoR 中),我需要能够从我的 Ruby 代码中访问系统参数。例如,我想允许用户更改服务器的主机名、时区或网络配置。
我目前的想法是拥有一个单独的 setuid 脚本(Perl、Ruby、??),以便我可以从我的 RoR 代码中调用它并执行操作。这很麻烦,也不是很优雅。我是 Ruby 新手,想知道是否有更好的方法来完成这类事情。
谢谢!
我正在构建一个小型系统管理 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 任务的用户访问某些命令(如hostname
, )。ifconfig
这可能会带来很大的安全问题。我最喜欢的例子是允许 sudo 访问 vim,这似乎是无害的,直到你运行sudo vim
,然后!bash
突然你通过文本编辑器拥有对机器的完全 root 访问权限。
另一种方式(更容易安全地执行) - 有一个执行所需任务(例如更改主机名)的 rake 任务(或几个单独的脚本)。说,/usr/bin/myapp_systemtasks
由 拥有root:root
,然后允许 sudo 访问该脚本。确保您非常小心地清理脚本接受的输入(以防止诸如外壳转义之类的事情)。
所以,有办法做到这一点,但归根结底,您正在为系统级配置创建一个 Web 界面,这很难安全地完成。无论您决定做什么,请确保它经过良好测试(由您和其他人)
我用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
一个人建议使用类似的东西result = %x[uptime]
并将我指向这篇非常有用的博客文章。我认为这可以通过结合使用 sudo 调用并在 sudoers 中具有适当权限的某种包装脚本来实现。