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.
3 Réponses :
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
.
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?
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
etgroup
, 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
etgroup
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.
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')
Les travaux suivants:
c.run("echo 'whoami' | sudo su - dev_user") c.run("echo 'cd /some/directory && ./somescript.sh' | sudo su - dev_user")