11

我最近开始研究用于远程部署的结构。我需要切换到差异用户(从我登录的用户)并且无法弄清楚。甚至有可能,如果可以,怎么办?我当前的用户没有sudo权限。

我尝试更改以下环境变量

env.sudo_prefix = "su newUser -c "
env.sudo_prompt = "Password:"

但是fabric不等待'newUser'的密码输入并且失败。

out: Password: 
[oldUser@ec2-111-11-111-111.compute-1.amazonaws.com] out: su: incorrect password

Fatal error: sudo() received nonzero return code 1 while executing!

Requested: touch x
Executed: su newUser -c  -u "root"  /bin/bash -l -c "cd /home/oldUser/upgrade && touch x"

Aborting.
Disconnecting from oldUser@ec2-111-11-111-111.compute-1.amazonaws.com... done.

更新:

正如 JF Sebastian 所建议的那样,su newUser -c它可以工作,但它会提示每个服务器的每个命令的密码,这违背了自动化的目的。Fabric中有什么方法可以根据提示传递相同的值(在这种情况下,它总是Password:

4

2 回答 2

11

谢谢JF Sebastian,有几个问题。

  1. Fabric 懒惰地建立连接,所以我必须在调用 su 之前建立一个虚拟连接以避免上下文切换。
  2. 密码需要存储在全局范围内,以便可以重用。Fabric 不会将其放入缓存中以用于覆盖 su 命令。

这就是最终要做的事情。它的工作。

pwd = None
@hosts('myhost.com')
def test():
    with cd('/home/oldUser/upgrade'):
        run('ls')  #This is to connect aggressively (instead of lazily)
        global pwd  #Change the scope of pwd
        if pwd is None:
            pwd = getpass.getpass('enter password for newUser')

        execute(su, pwd, 'newUser', 'touch x')  
        run ('ls')
        execute(su, pwd, 'newUser', 'rm x') 
        run ('ls')

def su(pwd, user, command):
    with settings(
        password= "%s" % pwd,
        sudo_prefix="su %s -c " % user,
        sudo_prompt="Password:"
        ):
        sudo(command)
于 2012-09-28T22:58:29.340 回答
7

如果您不能 ssh asnewuser并且不能使用sudo(command, user='newuser')

import getpass # just for demonstration
from fabric.api import sudo, settings

def su(user, command):
    with settings(password=getpass.getpass('enter password for %s: ' % user),
                  sudo_prefix="su %s -c " % user,
                  sudo_prompt="Password:"):
        sudo(command)
于 2012-09-28T18:19:29.763 回答