Fabric: Como implementar a chamada "sudo su -"?

Criado em 29 out. 2013  ·  9Comentários  ·  Fonte: fabric/fabric

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

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')

Todos 9 comentários

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

  • logar no servidor com minhas credenciais
  • no shell login como outro usuário com permissão específica e ambiente configurado
  • executar comando

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

supriyopaul picture supriyopaul  ·  4Comentários

haydenflinner picture haydenflinner  ·  5Comentários

SamuelMarks picture SamuelMarks  ·  3Comentários

acdha picture acdha  ·  4Comentários

bitprophet picture bitprophet  ·  6Comentários