Domanda

Tessuto per eseguire i comandi su un server remoto. L'utente con cui mi collego su quel server ha alcuni privilegi sudo, e non richiede una password per utilizzare questi privilegi. Quando SSH'ing al server, posso correre sudo blah e l'esecuzione del comando senza richiedere una password. Quando provo ad eseguire lo stesso comando tramite la funzione sudo di tessuto, ottengo richiamato per una parola d'accesso. Questo perché Tessuto costruisce un comando nel seguente modo quando si utilizza sudo:

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

Ovviamente, il mio utente non dispone dell'autorizzazione per eseguire /bin/bash senza una password.

Ho lavorato tutto il problema utilizzando run("sudo blah") invece di sudo("blah"), ma mi chiedevo se c'è una soluzione migliore. C'è una soluzione per questo problema?

È stato utile?

Soluzione

Prova a passare shell=False a sudo. In questo modo / bin / bash non verrà aggiunto al comando sudo. sudo('some_command', shell=False)

Dalla linea 503 di tessuto / operations.py :

if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

gli sguardi blocco else come questo:

                                             # V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))

Altri suggerimenti

È possibile utilizzare:

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

Questa è la risposta più diretta alla tua domanda:   In realtà non ha un problema; si comprende male come run Fabric () e sudo () lavoro.

Il tuo "soluzione" non è una soluzione, è la risposta valida al 100% al problema.

Ecco un semplice insieme di regole: 1) Utilizzare "run ()" quando non vi aspettate un prompt. 2) l'uso "sudo ()" quando non si aspettano un prompt. (Questo dovrebbe essere vero per tutti o la maggior parte dei comandi che richiedono una soluzione tempestiva, anche se l'eseguibile in questione non è Bash o Sudo).

Questa stessa risposta vale per le persone che cercano di eseguire i comandi sotto "sudo". Anche se sudoers ha config senza password per l'utente corrente su qualche sistema, se si utilizza sudo () al posto di run () allora si avrà forzare un prompt (a meno che il codice di tessuto contiene già una password di ENV o una chiave).

A proposito l'autore del Tessuto ha risposto alla mia domanda - molto simile alla tua domanda - in #IRC. Bravo ragazzo, uno degli eroi non celebrati dell'open source per persistere nel suo lavoro in tessuto e paramiko.

... Nel mio ambiente di test, v'è sempre 1 nome utente che ha pieno accesso senza password per sudo. Digitando sudo echo hello non mi pronta. Inoltre, l'utente sudo è configurato con "requiretty!", Così tutti i comandi possono essere eseguiti su SSH (come SSH saltellando tra gli host). Questo significa che può semplicemente utilizzare "run ()" con di eseguire "sudo qualcosa", ma è solo un altro comando che viene eseguito senza richiesta. Per quanto riguarda la sicurezza è interessato, è il lavoro di qualcuno per bloccare un host di produzione, ma non una serie di test. (Se sono costretti a cose di prova da e e non può automatizzare, questo è un problema enorme).

Nel file / etc / sudoers add

user ALL=NOPASSWD: some_command

dove utente è l'utente sudo e some_command il comando che si desidera eseguire con il tessuto, poi in fuga sceneggiatura tessuto sudo con shell = False:

sudo('some_command', shell=False)

Questo funziona per me

Nel file /etc/sudoers, si potrebbe aggiungere

user ALL=NOPASSWD: /bin/bash

... dove user è il tuo nome utente tessuto.

Ovviamente, si può fare solo se si ha accesso di root, come /etc/sudoers è scrivibile solo da root.

Inoltre, ovviamente, questo non è terribilmente sicura, ad essere in grado di eseguire le foglie /bin/bash si apre alla sostanza nulla, quindi se non si ha accesso root e chiedere un amministratore di sistema per fare questo per voi, probabilmente vinto 't.

Linux Noob qui ma ho trovato questa domanda durante il tentativo di installare grafite tessuto su un EC2 AMI. Tessuto mantenuto spingendo per una password di root.

Il trucco evntual doveva passare nel ssh file della chiave privata al tessuto.

fab -i key.pem graphite_install -H root@servername

È inoltre possibile utilizzare le password per più macchine:

from fabric import env
env.hosts = ['user1@host1:port1', 'user2@host2.port2']
env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'}

Vedere questa risposta: https://stackoverflow.com/a/5568219/552671

Recentemente ho affrontato questo stesso problema, e ha trovato la risposta di Crossfit_and_Beer confusione.

Un modo per ottenere questo è supportato tramite utilizzando env.sudo_prefix, come documentato da questo github commit ( questo PR )

Il mio esempio di utilizzo:

env.sudo_prefix = 'sudo '
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top