6
votes

Python Fabric Sudo su - utilisateur

Actuellement, je fais ce qui suit à partir de la ligne de commande:

fab abcd
What's your sudo password?
[sudo] password: Sorry, user myuser is not allowed to execute '/bin/bash -l -c whoami' as dev_user on dev-server.

Aucun problème d'autorisation.

Le myuser a assez de permission pour faire ce qui a été tapé ci-dessus, mais il n'a pas la permission de faire sudo su -c whoami dev_user

J'ai essayé le code suivant

from fabric import Connection, task

@task
def abcd(ctx):
    sudo_pass = getpass.getpass("What's your sudo password?")
    config = Config(overrides={'sudo': {'password': sudo_pass}})
    with Connection('dev-server', user='myuser', connect_kwargs={"password": sudo_pass}, config=config) as c:
        c.sudo('/bin/bash -l -c whoami', user='dev_user')

J'obtiens le résultat suivant:

$ ssh myuser@remote-server 
password:
[myuser@remote-server ~]$ sudo su - dev_user
[dev_user@remote-server ~]$ whoami
dev_user
[dev_user@remote-server ~]$

Existe-t-il un moyen de faire en sorte que fabric fasse ce que j'ai fait à partir de la ligne de commande?

La modification du fichier sudoers n'est pas une option.

Le serveur distant est Linux RH 7.6.

Merci.


0 commentaires

3 Réponses :


-1
votes

Avec paython 3x et fabric 2.4.0 vous pouvez l'utiliser comme ceci

​​install fabric using pip pip3 install fabric> = 2.4.0

from fabric import Connection as connection, task

@task
def executeTask(ctx):
    with connection(host=dev_server, user=myuser) as c:
         c.run('sudo su - dev_user')

Placez ce code dans un fichier appelé fabfile.py et exécutez-le en exécutant cette commande depuis votre ligne de commande fab executeTask .


1 commentaires

J'ai essayé votre suggestion, mais après l'exécution, elle reste suspendue en attendant que je saisisse d'autres commandes. Mon objectif était de faire plus d'appels c.run après le c.run ('sudo su - dev_user'), comme c.run ('whoami') et cela afficherait le dev_user. c'est-à-dire que je voudrais exécuter la fonction c.run en tant que dev_user après l'avoir sudo-ing. Cela serait-il possible?



3
votes

Oui, vous pouvez utiliser sudo avec un argument user = , pour utiliser sudo pour passer à un autre utilisateur, comme vous le faites dans le shell:

from  fabric import Connection, Config

config = Config(overrides={'sudo': {'user': 'sudo_user'}})
c = Connection('host', config=config)

c.sudo('whoami')

sudo accepte les arguments supplémentaires user et group , qui sont transmis à sudo et vous permettent de s'exécuter en tant qu'utilisateur et / ou groupe autre que la racine. Sur la plupart des systèmes, le programme sudo peut prendre une chaîne username / group ou un entier userid / groupid (uid / gid); user et group peuvent également être des chaînes ou des entiers.

http://docs.fabfile.org/en/1.14/api/core/operations.html?highlight=sudo#fabric.operations.sudo

La solution ci-dessus ne fonctionnera que si vous pouvez exécuter sudo sans entrer votre mot de passe. Si votre compte, myuser nécessite un mot de passe pour exécuter sudo , vous pouvez demander ce mot de passe et le transmettre à la configuration de fabric :

import getpass
from fabric import Connection, Config

sudo_pass = getpass.getpass("What's your sudo password?")
config = Config(overrides={'sudo': {'password': sudo_pass}})
c = Connection('host', config=config)

c.sudo('/bin/bash -l -c whoami', user='dev_user')

http://docs.fabfile.org/en/2.3/getting-started.html#the-sudo-helper

Une dernière idée:

from  fabric import Connection

c = Connection('host')
c.sudo('/bin/bash -l -c whoami', user='dev_user')

Notez qu'aucun mot de passe sudo n'est fourni dans ce cas, mais qu'un utilisateur l'est, dans la configuration de Config . Et c.sudo est redevenu un simple c.sudo ('whoami') . Cela doit être interprété comme sudo su - sudo_user par Fabric.


3 commentaires

Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacée vers chat . Veuillez modifier toute information pertinente dans la réponse.


@CodyGray Merci, je ne connaissais pas le chat.


OK @CodyGray. Désolé pour ça. Un dernier commentaire. faire le suivant semble avoir fonctionné, mais cela semble très limité. c.run ('echo "whoami" | sudo su - dev_user')



2
votes

Les travaux suivants:

c.run("echo 'whoami' | sudo su - dev_user")
c.run("echo 'cd /some/directory && ./somescript.sh' | sudo su - dev_user")


0 commentaires