11 votes

passer à un autre utilisateur en utilisant le tissu

J'ai récemment commencé à étudier les tissus pour le déploiement à distance. J'ai besoin de passer à un utilisateur différent (de celui sous lequel je me connecte) et je ne parviens pas à le faire. Est-ce possible, et si oui, comment ? Mon utilisateur actuel n'a pas sudo permissions.

J'ai essayé de modifier les variables d'environnement suivantes

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

Mais fabric n'attend pas la saisie du mot de passe pour 'newUser' et échoue.

out: Password: 
[oldUser@ec2-111-11-111-111.compute-1.amazonaws.com] 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 oldUser@ec2-111-11-111-111.compute-1.amazonaws.com... done.

Mise à jour :

Comme l'a suggéré J.F. Sebastian, su newUser -c fonctionne, mais il demande le mot de passe pour chaque commande et pour chaque serveur, ce qui va à l'encontre de l'objectif de l'automatisation. Existe-t-il un moyen dans Fabric de passer la même valeur en fonction de l'invite (dans ce cas, c'est toujours le mot de passe qui est demandé) ? Password: )

11voto

shailesh mangal Points 197

Merci J F Sebastian Il y a eu quelques prises.

  1. Fabric établit les connexions paresseusement, j'ai donc dû établir une connexion factice avant d'invoquer su pour éviter le changement de contexte.
  2. Pwd doit être stocké dans la portée globale et pour qu'il puisse être réutilisé. Fabric ne le met pas dans le cache pour les commandes su écrasées.

Voici ce que j'ai fini par faire. Ça marche.

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)

7voto

J.F. Sebastian Points 102961

Si vous ne pouvez pas vous connecter en tant que newuser et ne peut pas utiliser 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X