这不是一个答案,但我认为如果不修改代码,您想要做的事情是不可能的。原因如下:
有两种主要情况需要使用不同的用户:
- 由于文件所有权,部署需要以特定用户身份运行。
- 部署需要以 root 权限运行。
在第一种情况下,您通常只需告诉 Capistrano 以该用户身份进行 ssh。
在第二种情况下,您可以告诉 Capistrano 使用无密码 sudo 运行某些命令(http://capistranorb.com/documentation/getting-started/authentication-and-authorization/#authorization http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/#authorisation).
我可以看到这样一种情况:只有一个用户可以通过 SSH 访问,但文件所有权和权限基于另一个用户,因此您希望使 su 成为工作流程的一部分。我确信这是可能的,但如果我必须这样做,我将阅读 Capistrano 的源代码并覆盖 shell 命令的执行方式。这将是非同小可的。
如果你有一个特定的命令,比如rm
需要以不同用户身份运行,您可以使用SSHKit.config.command_map[:rm] = 'sudo rm'
机制来做到这一点。
简而言之,我认为从表面上看,您所要求的内容并不容易用 Capistrano 完成。如果您有特定的用例,我们也许能够提供建议,告诉您如何以不同的方式处理问题,从而更好地发挥 Capistrano 的优势。
祝你好运!
Update
进一步看,capistrano-rbenv gem 有一个机制,它可以覆盖所有命令的执行:
task :map_bins do
SSHKit.config.default_env.merge!({ rbenv_root: fetch(:rbenv_path), rbenv_version: fetch(:rbenv_ruby) })
rbenv_prefix = fetch(:rbenv_prefix, proc { "#{fetch(:rbenv_path)}/bin/rbenv exec" })
SSHKit.config.command_map[:rbenv] = "#{fetch(:rbenv_path)}/bin/rbenv"
fetch(:rbenv_map_bins).each do |command|
SSHKit.config.command_map.prefix[command.to_sym].unshift(rbenv_prefix)
end
end
https://github.com/capistrano/rbenv/blob/master/lib/capistrano/tasks/rbenv.rake#L17 https://github.com/capistrano/rbenv/blob/master/lib/capistrano/tasks/rbenv.rake#L17
您可能会在类似的事情上取得成功。