50 votes

Puis-je éviter que le tissu m'invite pour un sudo mot de passe?

Je suis à l'aide de Tissu pour exécuter des commandes sur un serveur distant. L'utilisateur avec lequel je me connecter sur ce serveur possède certains privilèges sudo, et ne pas exiger un mot de passe pour utiliser ces privilèges. Lorsque SSH avec le serveur, je peux faire tourner sudo blah et la commande s'exécute sans demander de mot de passe. Lorsque j'essaie de lancer la même commande via le Tissu de l' sudo de la fonction, je reçois invité pour un mot de passe. C'est parce que le Tissu construit une commande de la façon suivante lors de l'utilisation d' sudo:

sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

Évidemment, mon utilisateur n'est pas autorisé à 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 si il y a une meilleure solution. Est-il une solution pour ce problème?

32voto

sdolan Points 15572

Essayer de passer shell=False de sudo. De cette façon, /bin/bash ne seront pas ajoutés à la commande sudo. sudo('some_command', shell=False)

À partir de la ligne de 503 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))

13voto

ScottInNH Points 108

C'est la plus directe, la réponse à votre question: Vous n'avez pas réellement avoir un problème; vous ne comprenez pas comment le Tissu run() et sudo() de travail.

Votre "solution" n'est PAS une solution, elle est 100% de réponse valable au problème.

Voici un ensemble de règles simples: 1) Utiliser "run()" quand vous ne vous attendez pas à une invite de commandes. 2) utiliser "sudo()" quand on s'attend à une invite de commandes. (ce doit être vrai pour tous ou la plupart des commandes nécessitant une invite de commandes, même si l'exécutable en question n'est pas de Bash ou Sudo).

Cette même réponse s'applique à des gens en essayant d'exécuter des commandes sous "sudo". Même si sudoers a sans mot de passe config pour l'utilisateur en cours sur certains système, si vous utilisez sudo() au lieu de run() puis vous la force d'une invite de commande (à moins que le Tissu de code contient déjà un ENV clé ou mot de passe).

BTW, l'auteur de Tissu répondu à ma question - très semblable à votre question en #IRC. Nice guy, l'un des héros méconnus de l'open source pour la persistance dans son Tissu et Paramiko travail.

13voto

Gabriel Gcia Fdez Points 143

Vous pouvez utiliser:

fabric.api import env
# [...]
env.password = 'yourpassword'

5voto

sebastian serrano Points 574

Dans votre fichier /etc/sudoers ajouter

user ALL=NOPASSWD: some_command

où user est votre utilisateur sudo et some_command la commande que vous souhaitez exécuter avec tissu, puis sur le tissu de script exécuter sudo avec shell=False:

sudo('some_command', shell=False)

cela fonctionne pour moi

1voto

CanSpice Points 14749

Dans votre /etc/sudoers le fichier, vous pouvez ajouter

user ALL=NOPASSWD: /bin/bash

...où est - user est votre nom d'utilisateur Tissu.

Évidemment, vous ne pouvez le faire que si vous avez accès à la racine, comme /etc/sudoers est uniquement accessible en écriture par l'utilisateur root.

Bien évidemment, ce n'est pas très sécurisé, comme étant en mesure d'exécuter /bin/bash vous laisse ouvert pour quoi que ce soit, donc si vous n'avez pas accès à la racine et d'avoir à demander à un administrateur de le faire pour vous, ils ne le feront probablement pas.

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