Fabric: Comment implémenter l'appel "sudo su -" ?

Créé le 29 oct. 2013  ·  9Commentaires  ·  Source: fabric/fabric

Est-il possible d'imiter la commande "sudo su - user_name" puis d'exécuter les commandes dont j'avais besoin ?

J'ai essayé run et sudo et malheureusement il n'y a aucun moyen de le faire. S'il vous plaît aider

Commentaire le plus utile

@polusok @kusnier Je travaille avec des restrictions similaires. vous pouvez essayer de transmettre vos commandes de cette façon.

run('echo "whoami" | sudo su - nom d'utilisateur')

Tous les 9 commentaires

Le '-' est-il important dans ce que vous essayez de faire ? (par exemple, invoquer une connexion) ou essayez-vous simplement d'exécuter une commande en tant qu'utilisateur différent de l'utilisateur et de la racine actuels ?

Si l'effet de la connexion n'est pas important, vous pouvez procéder comme suit...

sudo("mkdir /var/www/new_docroot", user="www-data")

ou

   with settings(sudo_user='mysql'):
            sudo("whoami") # prints 'mysql'

ou si la connexion est importante (manière hacky), vous pouvez le faire, je suppose ...

   sudo("su - usernaeme -c 'command to be run'")

Oui - est important pour moi. je dois mettre en oeuvre

  • me connecter au serveur avec mes informations d'identification
  • dans le shell, connectez-vous en tant qu'autre utilisateur avec une autorisation spécifique et un environnement configuré
  • exécuter la commande

Veuillez noter que je n'ai que le mot de passe de mon compte et que je n'ai pas de mot de passe pour ces utilisateurs à l'étape 2, donc je dois me connecter via

sudo su - user_name

Malheureusement, je ne peux pas l'utiliser car il est interdit en raison de mes autorisations

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.

D'autres suggestions?

@polusok : Avez-vous trouvé une solution de contournement ? J'ai le même problème. Je ne peux utiliser que sudo su - jboss pour devenir utilisateur de jboss.

@polusok @kusnier Je travaille avec des restrictions similaires. vous pouvez essayer de transmettre vos commandes de cette façon.

run('echo "whoami" | sudo su - nom d'utilisateur')

npalrecha, cela semble fonctionner mais demande le mot de passe sur chaque commande. N'y a-t-il vraiment aucun moyen de simplement sudo su - user et d'exécuter toutes les commandes suivantes en tant qu'utilisateur?

J'ai eu le même problème... Si vous pouvez modifier le fichier /etc/sudoers , c'est probablement la solution la plus simple. Votre ligne lit probablement username host = ALL mais devrait lire username host = (ALL) ALL .

Voici ma solution de contournement pour ceux qui ne peuvent pas.
Notez que faire sudo(command, user="otheruser") avec ces solutions ne fonctionnera pas.

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

Utilisez-le comme...

<strong i="17">@task</strong>
def test():
    with Sudosu(user=username):
        sudo("whoami")

Sinon, en tant que décoratrice...

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                                                                          

Utilisez-le comme...

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

Quelle que soit la façon dont vous vous sentez. Ma préférence va selon le contexte.

Bien sûr, vous pouvez simplement définir env.sudo_prefix , mais vous devrez le réinitialiser si vous voulez faire un sudo normal.

Juchiu, j'avais de grands espoirs mais cela n'a pas fonctionné pour moi. J'obtiens essentiellement la même erreur que le tissu seul donnait. Je suis sur Red Hat Enterprise Linux Server version 5.4 (Tikanga). La solution de Npalrecha fonctionne, ce n'est tout simplement pas élégant bien sûr.

Erreur:
Désolé, l'utilisateur xxxx n'est pas autorisé à exécuter '/bin/su - yyyy -c -u
yyyy /bin/bash -l -c whoami' en tant que root sur myserver.com.com.

Exécuté : sudo -S -p 'mot de passe sudo :' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"

Il semble qu'il essaie toujours de passer -u yyyy à sudo. Je crois que lorsque vous effectuez votre appel sudo() , vous passez toujours user en tant que kwarg.

Mais votre message d'erreur est intéressant, car il semble que vous ne soyez peut-être pas autorisé dans sudo à exécuter su avec certains arguments, en particulier puisque vous êtes autorisé à sudo su - yyyy normalement.

FWIW, les arguments ne semblaient pas avoir de sens pour moi, mais j'ai compris ce qui était bizarre.
Sudo semble avoir essayé d'exécuter la commande su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami" . Su semble alors essayer d'exécuter -u "achuser" /bin/bash -l -c "whoami" , mais n'exécute que whoami car il pense que -c a été passé plusieurs fois, et il ne prend que le dernier. J'essaierais probablement d'éviter que cela se produise.

C'est plus du fourrage pour la liste de diffusion qu'un problème réel avec le tissu - va fermer en tant que tel.

Cette page vous a été utile?
0 / 5 - 0 notes