Переключиться на другой пользователь, используя ткань

Недавно я начал изучать ткань для удаленного развертывания. Мне нужно переключиться на пользователя-diff (от того, на который я зашел), и я не могу понять это. Это даже возможно, если да, то как? Мой текущий пользователь не имеет разрешений sudo.

Я попытался изменить следующие переменные среды

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

Но ткань не ждет ввода пароля для "newUser" и не работает.

out: Password: 
[[email protected]] 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 [email protected] done.

Update:

Как предположил J.F.Sebastian, su newUser -c работает, но он запрашивает пароль для каждой команды для каждого сервера, что поражает цель автоматизации. Есть ли способ в Fabric передать одно значение по подсказке (в этом случае всегда Password:)

Ответ 1

Спасибо J F Sebastian, Было несколько уловов.

  • Ткань делает соединения лениво, поэтому мне пришлось сделать фиктивное соединение, прежде чем вызывать su, чтобы избежать переключения контекста.
  • Pwd необходимо хранить в глобальной области действия и чтобы его можно было повторно использовать. 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)

Ответ 2

Если вы не можете ssh как newuser и не можете использовать 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)