Existe alguma maneira de imitar o comando "sudo su - user_name" e executar os comandos que eu precisava?
Tentei run
e sudo
e infelizmente não tem como. Por favor ajude
O '-' é importante no que você está tentando fazer? (por exemplo, invocar um login) ou você está apenas tentando executar um comando como um usuário diferente do usuário atual e do root?
Se o efeito do login não for importante, você poderá fazer o seguinte...
sudo("mkdir /var/www/new_docroot", user="www-data")
ou
with settings(sudo_user='mysql'):
sudo("whoami") # prints 'mysql'
ou se o login for importante (maneira hackeada), você pode fazer isso, eu acho ...
sudo("su - usernaeme -c 'command to be run'")
Sim - é importante para mim. eu preciso implementar
Observe que eu tenho apenas a senha da minha conta e não tenho senha para os usuários na etapa 2, portanto, preciso me conectar através
sudo su - user_name
Infelizmente, não posso usá-lo, pois é proibido devido às minhas permissões
sudo("su - usernaeme -c 'command to be run'")
Sorry, user user_name is not allowed to execute '/usr/bin/su - another_user -c pwd' as root on server.
Alguma outra sugestão?
@polusok : Você encontrou alguma solução alternativa? Eu tenho o mesmo problema. Eu só posso usar sudo su - jboss
para me tornar usuário do jboss.
@polusok @kusnier Estou trabalhando com restrições semelhantes. você pode tentar passar seus comandos dessa maneira.
run('echo "whoami" | sudo su - nome de usuário')
npalrecha, que parece funcionar, mas solicita a senha em cada comando. Realmente não há como apenas sudo su - user e executar todos os comandos subsequentes como esse usuário?
Eu tive o mesmo problema... Se você conseguir alterar o arquivo /etc/sudoers
, essa é provavelmente a solução mais fácil. Sua linha provavelmente lê username host = ALL
mas deve ler username host = (ALL) ALL
.
Aqui está a minha solução para aqueles que não podem.
Observe que fazer sudo(command, user="otheruser")
com essas soluções não funcionará.
class Sudosu:
def __init__(self, user):
self.user = user
def __enter__(self):
self.old_sudo_prefix = env.sudo_prefix
self.old_sudo_user, env.sudo_user = env.sudo_user, self.user
env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"
def __exit__(self, a, b, c):
env.sudo_prefix = self.old_sudo_prefix
env.sudo_user = self.old_sudo_user
Use assim...
<strong i="17">@task</strong>
def test():
with Sudosu(user=username):
sudo("whoami")
Alternativamente, como decorador...
def sudosu(user):
def wrap(f):
def inner(*args, **kwargs):
old_sudo_prefix = env.sudo_prefix
old_sudo_user, env.sudo_user = env.sudo_user, user
env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"
f(*args, **kwargs)
env.sudo_prefix = old_sudo_prefix
env.sudo_user = old_sudo_user
inner.__name__ = f.__name__
return inner
return wrap
Use assim...
<strong i="24">@task</strong>
@sudosu("username")
def whoami():
sudo("whoami")
ou...
sudo = sudosu("username")(sudo)
<strong i="28">@task</strong>
def whoami():
sudo("whoami")
Do jeito que você quiser. Minha preferência é como o contexto.
Claro, você pode simplesmente definir env.sudo_prefix
, mas você precisará redefini-lo se quiser fazer um sudo normal.
Juchiu, eu tinha grandes esperanças, mas isso não funcionou para mim. Basicamente, recebo o mesmo erro que o tecido sozinho estava dando. Estou no Red Hat Enterprise Linux Server versão 5.4 (Tikanga). A solução da Npalrecha funciona, mas não é elegante, é claro.
Erro:
Desculpe, o usuário xxxx não tem permissão para executar '/bin/su - yyyy -c -u
aaaa /bin/bash -l -c whoami' como root em myserver.com.com.
Executado: sudo -S -p 'sudo password:' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
Parece que ainda está tentando passar -u yyyy
para o sudo. Eu acredito que quando você está fazendo seu call sudo()
, você ainda está passando user
como um kwarg.
Mas sua mensagem de erro é interessante, pois parece que você pode não ter permissão no sudo para executar su com certos argumentos, especialmente porque você tem permissão para sudo su - yyyy
normalmente.
FWIW, os argumentos não pareciam fazer sentido para mim, mas descobri o que era estranho.
Sudo parece ter tentado executar o comando su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
. Su então parece tentar executar -u "achuser" /bin/bash -l -c "whoami"
, mas está apenas executando whoami
porque pensa que -c foi passado várias vezes, e apenas leva o último. Eu provavelmente tentaria evitar que isso acontecesse.
Isso é mais uma lista de discussão do que um problema real com o tecido - vai fechar como tal.
Comentários muito úteis
@polusok @kusnier Estou trabalhando com restrições semelhantes. você pode tentar passar seus comandos dessa maneira.
run('echo "whoami" | sudo su - nome de usuário')