【问题标题】:How to run a bash command as a different user in Capistrano?如何在 Capistrano 中以不同用户身份运行 bash 命令?
【发布时间】:2014-05-06 04:32:02
【问题描述】:

我将如何在 Capistrano 中完成以下任务?

sudo su - postgres
/usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data/

以下任务不起作用:

task :postgres_check do
 on roles(:db) do in: :sequence |host|
  execute "sudo su - postgres << EOF
   /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data/ 
   EOF"  
 end
end

execute 语句中的命令在 bash 脚本中运行。

编辑 1:

我还尝试了以下方法:

task :postgres_check do
  on roles(:postgres_pref_db), in: :sequence do |host|
   execute  "/usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data", :shell => "sudo su - postgres" 
  end
 end

哪些错误:

DEBUG [68eb95f2] Command: /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data
DEBUG [68eb95f2]        pg_ctl: could not open PID file "/var/lib/pgsql/9.2/data/postmaster.pid": Permission denied
cap aborted!
SSHKit::Command::Failed: /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data stdout: Nothing written

它似乎仍在以ssh 用户的身份执行命令。

【问题讨论】:

  • 如果您认为我的答案对您的问题的正确答案,请将其标记为完整。

标签: capistrano capistrano3


【解决方案1】:

我遇到了这个并为自己探索了答案。我也不会接受答案,我会提供我所做的。

task :copy_files do
  on  roles(:web) do |host|
    as 'other_user' do
        execute "whoami"
    end 
  end
end

Capistrano 3 使用 SSH KIT,我发现这些示例非常有助于让 bash 命令在我的任务中工作。 https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md

您需要查看 ssh kit 并了解 on()、with()、with()、as() ......它们可以以任何顺序嵌套使用。因此,即使需要几分钟的时间来学习,您最终也会拥有很多控制权。

我认为对于您的具体示例,您将希望使用 as() 和 within() 成为 postgres 用户并在某个目录中运行命令。

我还必须为我的部署用户在我的 /etc/sudoers 上禁用 requiretty。

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2017-11-05
    • 1970-01-01
    • 2020-05-01
    • 2010-11-04
    • 2010-11-22
    相关资源
    最近更新 更多