2013-02-27 13 views
5

Ich versuche, Fabric zu verwenden, um einige administrative Arbeit zu automatisieren, die ich auf einigen Servern ausführe. Der allgemeine Ablauf ist wie folgt:Ausführen von Fabric-Skripten als root

  1. SSH mit lokalen Benutzer
  2. Lauf: sudo su - root werden (auch hier lokale Benutzer-Passwort Providing)
  3. die Arbeit als root tun :)

Leider Die Verwendung von run('sudo su -') blockiert die Ausführung der Skripts und ermöglicht Benutzereingaben. Wenn ich oder Ctrl+D eintippe, wird das Scipt fortgesetzt, aber ohne Root-Rechte.

Ich habe ein ähnliches Problem in Switching user in Fabric gesehen, aber ich bin auf sudo su - beschränkt, weil ich nicht erlaubt bin die /etc/sudoers Datei zu ändern, das die folgende Zeile enthält:

localuser ALL = /usr/bin/su -

ich die Quelle des Gewebes durchsucht versuchen um einen Workaround zu finden, aber ohne Erfolg.

+0

Werfen Sie einen Blick auf http://docs.fabfile.org/en/1.4.2/usage/env.html#sudo-prefix und dieses Beispiel: http://stackoverflow.com/questions/12641514/switch- to-different-user-using-fabric – alecxe

+0

Die Verwendung von 'sudo_prefix = 'su - -c' wie in diesem Beitrag beschrieben erfordert das root-Passwort. Wenn ich 'sudo_prefix = 'sudo su - -c'' benutze ich diese Fehlermeldung 'Sorry, Benutzer localuser darf nicht ausführen// usr/bin/su - -c/bin/bash-l-c pwd 'als root auf hostname.' – Marin

+0

Einstellung 'shell = False' scheint keine Wirkung zu haben.Die Einstellung 'pty = False' gibt den Fehler 'sudo: no tty present und kein askpass program specified' zurück. – Marin

Antwort

1

Es gibt mehrere Lösungen für Ihr Problem. Zuerst möchten Sie Befehle mit sudo ausführen. Sie können die Fabric-Methode sudo anstelle von run, die runs a shell command on a remote host, with superuser privileges (sudo ref) verwenden.

Zum Beispiel werden diese Befehle ausgeführt unter Verwendung von sudo:

sudo("~/install_script.py") 
sudo("mkdir /var/www/new_docroot", user="www-data") 
sudo("ls /home/jdoe", user=1001) 
result = sudo("ls /tmp/") 

Eine weitere Idee ist, dass Sie eine Reihe von Befehlen wickeln wollen (diese Notwendigkeit sudo ed sein). Sie können dazu Fabric-Kontextmanager (ref) verwenden. Insbesondere können Sie prefix oder settings verwenden.

Zum Beispiel:

with settings(user='root'): 
    run('do something') 
    run('do another thing') 

werden Sie fragen, sobald das root-Passwort dann Befehle als root ausführen. Sie können die Einstellungen ändern, um das Passwort zu speichern.

+0

Beide Lösungen funktionieren nicht für mich. Ich habe das erste versucht und das 'sudo ('pwd')' übersetzt in 'sudo -S -p 'sudo passwort:'/bin/bash -l -c" pwd "' und ich bekomme eine Fehlermeldung 'Sorry, Benutzer localuser darf '/ bin/bash -l -c pwd' nicht als root auf dem Hostnamen ausführen. Die zweite Lösung bedeutet, dass ich das root-Passwort habe, was ich nicht habe. – Marin

+0

Können Sie für die zweite Lösung das Passwort verwenden, das Sie normalerweise verwenden würden, um Superuser-Zugriff zu erhalten? – gbozee

4

das gleiche Problem wie Sie konfrontiert haben, (nur sudo su - user von admin erlaubt, sudo -u user -c cmd nicht erlaubt), hier ist meine Arbeitslösung mit fabric:

from ilogue.fexpect import expect, expecting, run 

def sudosu(user, cmd): 
    cmd += ' ;exit' 
    prompts = [] 
    prompts += expect('bash', cmd) 
    prompts += expect('assword:', env.password) 

    with expecting(prompts): 
     run('sudo su - ' + user) 

def host_type(): 
    sudosu('root', 'uname -s') 
+0

Das sieht nach einer guten Lösung aus, erfordert aber, dass Python auf dem Remote-Rechner ist. – jchysk

0

Es eine Lösung für das folgende Problem ist Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname. können Sie versuchen Sie sudo('mkdir ~/test_fabric',shell=False). Verwenden Sie den Parameter shell, um den Bash-Parameter -l zu vermeiden.