【发布时间】:2015-12-16 08:55:12
【问题描述】:
使用 Capistrano v3,我如何以其他用户身份通过su 运行所有远程任务?我在官方文档中找不到任何东西 (http://capistranorb.com/)
对于我的用例,每个虚拟主机都有一个 SSH 用户和一个用户。用户 A 连接到服务器并应以用户 B 的身份运行所有命令。
【问题讨论】:
使用 Capistrano v3,我如何以其他用户身份通过su 运行所有远程任务?我在官方文档中找不到任何东西 (http://capistranorb.com/)
对于我的用例,每个虚拟主机都有一个 SSH 用户和一个用户。用户 A 连接到服务器并应以用户 B 的身份运行所有命令。
【问题讨论】:
这不是一个很好的答案,但我认为如果不修改代码,您尝试做的事情是不可能的。原因如下:
在两种主要情况下您会使用不同的用户:
在第一种情况下,您通常只需告诉 Capistrano 以该用户身份进行 ssh。
在第二种情况下,您会告诉 Capistrano 使用无密码 sudo (http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/#authorisation) 运行某些命令。
我可以看到只有一个用户可以通过 SSH 访问的情况,但文件所有权和权限基于另一个用户,因此您希望 su 成为工作流程的一部分。我确信这是可能的,但如果我必须这样做,我会阅读 Capistrano 的源代码并覆盖 shell 命令的执行方式。这将是不平凡的。
如果您有像rm 这样的特定命令需要以不同的用户身份运行,您可以使用SSHKit.config.command_map[:rm] = 'sudo rm' 机制来执行此操作。
简而言之,从表面上看,我认为您所要求的不是 Capistrano 轻松完成的。如果您有特定的用例,我们可能会就您如何以不同的方式解决问题提供建议,这更能发挥 Capistrano 的优势。
祝你好运!
更新
进一步看,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
你可能会在类似的事情上取得成功。
【讨论】:
为了以另一个用户身份通过 su 运行所有远程任务,我认为您需要更改该用户的所有权。
我假设部署文件夹名称是 /public_html/test 。
sudo chown User:User /public_html/test # `chown` will change the owner ship so that `User` user can `**Read/Write**`
umask 0002
sudo chown User:User public_html/test/releases
sudo chown User:User public_html/test/shared
希望这能解决您的问题!!!
【讨论】: