我的当前想法是编写一个单独的setuid脚本(Perl、Ruby等),以便可以从我的RoR代码中调用它并执行操作。这相当繁琐且不太优雅。作为Ruby的新手,我想知道是否有更好的方法来完成这种事情。
谢谢!
我的当前想法是编写一个单独的setuid脚本(Perl、Ruby等),以便可以从我的RoR代码中调用它并执行操作。这相当繁琐且不太优雅。作为Ruby的新手,我想知道是否有更好的方法来完成这种事情。
谢谢!
有一系列RailsCasts的视频涵盖了后台任务。
可能最适合你的问题的是"Rake in Background",这可能是一个很好的起点?正如名称所示,它涵盖了从Ruby on Rails触发rake任务。
更改系统设置的最明显的解决方案是运行一个作为root的守护程序,它接受一些(非常有限且严格经过消毒的)输入,例如新主机名或服务器的新IP地址。其他剧集"Starling and Workling"和"Custom Daemon"也可能对此有所帮助。
更清洁的解决方案是使用sudo
。我可以想到两种(类似的)方法:
允许用户对某些命令(例如hostname
,ifconfig
)进行sudo访问以运行rake任务。这可能会带来很大的安全问题。我最喜欢的例子是允许sudo访问vim,它看起来无害,直到你运行sudo vim
,然后运行!bash
,突然之间你就可以通过文本编辑器完全掌控机器了。
另一种方法(更容易实现安全性)-编写一个rake任务(或几个单独的脚本),执行所需的任务(例如更改主机名)。比如,/usr/bin/myapp_systemtasks
由root:root
拥有,然后允许sudo访问该脚本。请务必非常小心地清理该脚本接受的输入(以防止像shell-escaping这样的事情发生)。
因此,有方法可以做到这一点,但归根结底,您正在为系统级配置创建Web界面,这非常难以确保安全。无论您决定采取何种措施,请确保经过充分的测试(由您和其他人)。
有人建议使用类似 result = %x[uptime]
的东西,并向我指出了这篇非常有帮助的博客文章。我认为通过结合某种包装脚本来实现是可行的,该脚本在使用sudo时被调用并具有sudoers中的适当权限。
我曾经使用过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