以不同的用户身份运行capistrano任务

时间:2013-02-11 17:01:18

标签: ruby-on-rails ruby capistrano

我是卡皮斯特拉诺的新手,并且几天来一直在反对这个问题,所以非常感谢一些帮助。

我们有一个讨厌的安全设置,这意味着我无法在远程服务器上以ssh用户身份运行capistrano任务。这是This problem的简单版本 - 似乎没有合适的答案。

编辑: 进一步深入研究,我发现我可以做类似的事情:

run "su - newuser" do |channel, stream, data|

          channel.send_data("#{password}\n")

          channel.send_data("rm -rf #{release_path}\n")

        end }

我可以用它来覆盖默认的部署方法,并完成我需要做的大部分工作。我可以在服务器上创建所需的目录,依此类推,并使用ssh转发从git作为ssh用户。这创造了我的下一个问题。我现在拥有newuser拥有的目录,其中包含ssh_user拥有的文件和目录。我确实有sudo权限作为newuser,但无法解决如何chmod文件。我尝试了类似的东西:

run "su - newuser" do |channel, stream, data

              channel.send_data("#{password}\n")

              channel.send_data("sudo chmod 775 #{cache_path}\n")

            end }

但是一切都只是挂起,好像这个块是在一个无限循环中执行的。显然有很多我不明白的地方,一些指针会非常感激 - 即使只是一个很好的相关阅读。

2 个答案:

答案 0 :(得分:2)

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invocation-Run 显示运行的:shell选项,您可以将其设置为:

run "your cmd", :shell => "su - other_user -s bash"

如果您使用预定义任务,则最好重新定义run和su以合并shell选项。 假设你的ssh用户可以没有密码su。如果不使用块来发送密码:

run "your cmd", :shell => "su - other_user -s bash" do |channel, stream, data|
  channel.send_data("#{other_user_password}\n")
end

答案 1 :(得分:0)

我最终提出的解决方案是获取所有现有的部署任务,并将它们放在新的命名空间中。然后我调用他们使用新方法运行的脚本,这取决于我是否需要以newuser或root运行它们,虽然与Viktor的解决方案不完全相同但是我接受了他的答案,即使它不是很有效对我来说

    def run_as(user, password, command, env)
      run "#{command}\n", :shell => "su - #{user}", :env => env do |channel, stream, data|   
        channel.send_data("#{password}\n")
      end
end