以其他用户身份运行任务

时间:2015-12-16 08:55:13

标签: capistrano capistrano3

使用Capistrano v3 ,如何通过su作为其他用户运行所有远程任务?我在官方文档(http://capistranorb.com/

中找不到任何内容

对于我的用例,每个虚拟主机都有一个SSH用户和一个用户。用户A连接到服务器,应该以用户B的身份运行所有命令。

2 个答案:

答案 0 :(得分:0)

这不是一个很好的答案,但我不认为如果没有代码修改你可以做什么。原因如下:

有两种主要情况可供您使用其他用户:

  1. 由于文件所有权,部署需要作为特定用户运行。
  2. 部署需要以root权限运行。
  3. 在第一种情况下,您通常只是告诉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-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

    你可能会有类似的成功。

答案 1 :(得分:-2)

为了通过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

希望这能解决你的问题!!!