Puis-je empêcher fabric de me demander un mot de passe sudo?
J'utilise Fabric pour exécuter des commandes sur un serveur distant. L'utilisateur avec lequel je me connecte sur ce serveur dispose de certains privilèges sudo et ne nécessite pas de mot de passe pour utiliser ces privilèges. Lorsque SSH'ing dans le serveur, je peux exécuter sudo blah
et la commande s'exécute sans demander de mot de passe. Lorsque j'essaie d'exécuter la même commande via la fonction sudo
de Fabric, un mot de passe m'est demandé. C'est parce que Fabric construit une commande de la manière suivante lors de l'utilisation sudo
:
sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"
Évidemment, mon utilisateur n'a pas la permission d'exécuter /bin/bash
sans mot de passe.
J'ai contourné le problème en utilisant run("sudo blah")
au lieu de sudo("blah")
, mais je me demandais s'il y avait une meilleure solution. Est-il une solution pour ce problème?
8 réponses
Essayez de passer shell=False
à sudo. De cette façon, /bin/bash ne sera pas ajouté à la commande sudo. sudo('some_command', shell=False)
À Partir de la ligne 503 de fabric/operations.py:
if (not env.use_shell) or (not shell):
real_command = "%s %s" % (sudo_prefix, _shell_escape(command))
Le bloc else ressemble à ceci:
# V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
_shell_escape(cwd + command))
Vous pouvez utiliser:
fabric.api import env
# [...]
env.password = 'yourpassword'
C'est la réponse la plus directe à votre question: Vous n'avez pas réellement de problème; vous vous méprenez sur le fonctionnement de Fabric run() et sudo ().
Votre" solution de contournement " N'est pas une solution de contournement, c'est la réponse 100% valide au problème.
Voici un ensemble simple de règles: 1) Utilisez "run ()" lorsque vous ne vous attendez pas à une invite. 2) Utilisez "sudo ()" lorsque vous attendez une invite. (cela devrait être vrai pour toutes ou la plupart des commandes nécessitant une invite, même si L'exécutable en question n'est pas Bash ou Sudo).
Cette même réponse s'applique aux personnes essayant d'exécuter des commandes sous "sudo". Même si sudoers a une configuration sans mot de passe pour l'utilisateur actuel sur un système, Si vous utilisez sudo () au lieu de run (), vous forcerez une invite (sauf si le code Fabric contient déjà un mot de passe ou une clé ENV).
BTW l'auteur de Fabric a répondu à ma question-très similaire à votre question-dans # IRC. Nice guy, l'un des héros méconnus de l'open source pour la persistance dans son tissu et le travail Paramiko.
...dans mon environnement de test, il y a toujours 1 Nom d'utilisateur qui a un accès complet sans mot de passe à sudo. Taper sudo echo hello
ne me demandera pas. En outre, cet utilisateur sudo est configuré avec"!requiretty " ainsi, toutes les commandes peuvent fonctionner sur SSH (comme SSH saut entre les hôtes). Cela signifie que je peux simplement utiliser " run () "avec pour exécuter" sudo something", mais c'est juste une autre commande qui s'exécute sans invite. Comme ce qui concerne la sécurité, c'est le travail de quelqu'un pour verrouiller un hôte de production, mais pas un test de l'hôte. (Si vous êtes obligé de tester les choses par et et ne peut pas automatiser, c'est un énorme problème).
Dans votre fichier /etc/sudoers ajoutez
user ALL=NOPASSWD: some_command
Où user est votre utilisateur sudo et some_command la commande que vous voulez exécuter avec fabric, puis sur le script fabric exécutez sudo avec shell = False:
sudo('some_command', shell=False)
Cela fonctionne pour moi
Dans votre fichier /etc/sudoers
, vous pouvez ajouter
user ALL=NOPASSWD: /bin/bash
...où user
est votre nom D'utilisateur Fabric.
Évidemment, vous ne pouvez le faire que si vous avez un accès root, car /etc/sudoers
n'est accessible qu'en écriture par root.
Évidemment, ce n'est pas très sécurisé, car pouvoir exécuter /bin/bash
vous laisse ouvert à n'importe quoi, donc si vous n'avez pas d'accès root et que vous devez demander à un administrateur système de le faire pour vous, ils ne le feront probablement pas.
Linux Noob ici mais j'ai trouvé cette question en essayant d'installer graphite-fabric sur un AMI EC2. Fabric a continué à demander un mot de passe root.
L'astuce evntual était de passer le fichier de clé privée ssh à fabric.
fab -i key.pem graphite_install -H root@servername
Vous pouvez également utiliser des mots de passe pour plusieurs machines:
from fabric import env
env.hosts = ['user1@host1:port1', 'user2@host2.port2']
env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'}
Voir cette réponse: https://stackoverflow.com/a/5568219/552671
J'ai récemment fait face à ce même problème et j'ai trouvé la réponse de Crossfit_and_Beer déroutante.
Un moyen pris en charge pour y parvenir est d'utiliser env.sudo_prefix
, comme documenté par ce commit github (à partir de ce PR)
Mon exemple d'utilisation:
env.sudo_prefix = 'sudo '