Переключиться на другой пользователь, используя ткань
Недавно я начал изучать ткань для удаленного развертывания. Мне нужно переключиться на пользователя-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)