我是卡皮斯特拉诺的新手,并且几天来一直在反对这个问题,所以非常感谢一些帮助。
我们有一个讨厌的安全设置,这意味着我无法在远程服务器上以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 }
但是一切都只是挂起,好像这个块是在一个无限循环中执行的。显然有很多我不明白的地方,一些指针会非常感激 - 即使只是一个很好的相关阅读。
答案 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