【问题标题】:What's the best way to perform system tasks from Ruby on Rails?从 Ruby on Rails 执行系统任务的最佳方式是什么?
【发布时间】:2010-09-24 00:09:55
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby setuid


    【解决方案1】:

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

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

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

    更简洁的解决方案是使用sudo。我能想到的有两种(相似的)方法:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是很好的信息,但我不确定它是否能解决我的问题。这些任务运行时间不长,也不需要后台运行。另外运行一个单独的服务器来处理重命名主机有点矫枉过正。
      • 即使有点矫枉过正,它也是在 Rails 应用程序中将作业生成给另一个用户的最简单方法。这不是插件的主要用途,但它会干净利落地完成这项工作。
      【解决方案3】:

      有人建议使用result = %x[uptime] 之类的东西,并把我指向这个very helpful blog post。我认为这可以通过结合使用 sudo 调用并在 sudoers 中具有适当权限的某种包装脚本来实现。

      【讨论】:

        【解决方案4】:

        我用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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 2011-06-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多