【问题标题】:Fabric sudo as another user with root privilegesFabric sudo 作为另一个具有 root 权限的用户
【发布时间】:2013-07-29 17:27:44
【问题描述】:

我正在编写一个 Fabric 部署脚本,该脚本以用户 MyAppUser 的身份运行(主机“MyAppUser@myapp.mycompany.com”,ssh 密钥有效,因此不需要密码)。其中一个步骤涉及将文件复制到 /etc/init 并更改权限,以便将来部署 MyAppUser 可以覆盖该文件。

MyAppUser 不是 sudoer。也不应该。为了将副本执行到/etc/init,我需要提升权限...所以我一直提示用户输入用户名并执行:

run('su %s -c "sudo cp /home/myappuser/git/myapp/myapp.conf /etc/init"')

这可行,但会提示我两次输入相同的密码。 (我一个sudoer)。

这里有很多问题,但核心的几个问题是:

  1. 为什么sudo("sudo cp /home/myappuser/git/myapp/myapp.conf /etc/init", user='Me) 不能按预期工作?看起来第一个 sudo(由 fabric 运行)忽略了user
  2. 有没有更好的方法来以另一个 sudoer 用户的身份执行需要 root 权限的命令? (一个 Bash 问题,而不是一个结构问题)。

【问题讨论】:

    标签: bash fabric


    【解决方案1】:

    1:您说 MyAppUser 不在 sudoers 中。所以它不能运行 sudo。使用调试标志来查看这一点,但您实际上是在这样做:

    $ ssh MyAppUser@myapp.mycompany.com "sudo -u me 'sudo cp ...'"
    

    因此,如果 MyAppUser 根本不能 sudo,那么作为这种用途的结构连接就不能 sudo。

    2:如果您有多个用户能够连接到这台机器,请使用 settings() 上下文管理器或 execute() 函数并在主机字符串中提供我(请参阅提示用户)作为要连接的用户。例如:

    execute(setup_task, host="me@myapp.mycompany.com")
    

    其中 setup_task 是复制到 init 目录的任务。

    【讨论】:

    • 这解决了我上面提到的问题。我最终所做的是决定在设置我的远程服务器时,我将其作为他们拥有要写入的文件的先决条件,然后我将使用> 写入它。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多