Fabric: Wie implementiert man den Aufruf „sudo su -“?

Erstellt am 29. Okt. 2013  ·  9Kommentare  ·  Quelle: fabric/fabric

Gibt es eine Möglichkeit, den Befehl "sudo su - user_name" zu imitieren und dann die von mir benötigten Befehle auszuführen?

Versuchte run und sudo und leider gibt es keine Möglichkeit, es zu schaffen. Bitte helfen Sie

Hilfreichster Kommentar

@polusok @kusnier Ich arbeite mit ähnlichen Einschränkungen. Sie können versuchen, Ihre Befehle auf diese Weise weiterzugeben.

run('echo "whoami" | sudo su - Benutzername')

Alle 9 Kommentare

Ist das '-' bei dem, was Sie zu tun versuchen, wichtig? (z. B. eine Anmeldung aufrufen) oder versuchen Sie nur, einen Befehl als ein anderer Benutzer als der aktuelle Benutzer und root auszuführen?

Wenn die Auswirkung der Anmeldung nicht wichtig ist, können Sie Folgendes tun ...

sudo("mkdir /var/www/new_docroot", user="www-data")

oder

   with settings(sudo_user='mysql'):
            sudo("whoami") # prints 'mysql'

oder wenn die Anmeldung wichtig ist (hacky way), könnten Sie dies tun, denke ich ...

   sudo("su - usernaeme -c 'command to be run'")

Ja - ist mir wichtig. muss ich umsetzen

  • Melden Sie sich mit meinen Anmeldeinformationen beim Server an
  • Melden Sie sich in der Shell als anderer Benutzer mit bestimmten Berechtigungen und konfigurierter Umgebung an
  • Befehl ausführen

Bitte beachten Sie, dass ich nur mein Kontopasswort habe und kein Passwort für diese Benutzer in Schritt 2, daher muss ich mich verbinden

sudo su - user_name

Leider kann ich es nicht verwenden, da es aufgrund meiner Berechtigungen verboten ist

sudo("su - usernaeme -c 'command to be run'")
Sorry, user user_name is not allowed to execute '/usr/bin/su - another_user -c pwd' as root on server.

Irgendwelche anderen Vorschläge?

@polusok : Hast du eine Problemumgehung gefunden? Ich habe das gleiche Problem. Ich kann nur sudo su - jboss verwenden, um jboss-Benutzer zu werden.

@polusok @kusnier Ich arbeite mit ähnlichen Einschränkungen. Sie können versuchen, Ihre Befehle auf diese Weise weiterzugeben.

run('echo "whoami" | sudo su - Benutzername')

npalrecha, das scheint zu funktionieren, fordert aber bei jedem Befehl zur Eingabe des Passworts auf. Gibt es wirklich keine Möglichkeit, einfach sudo su - user und alle nachfolgenden Befehle als dieser Benutzer auszuführen?

Ich hatte das gleiche Problem ... Wenn Sie die Datei /etc/sudoers ändern können, ist das wahrscheinlich die einfachste Lösung. Ihre Zeile lautet wahrscheinlich username host = ALL , sollte aber username host = (ALL) ALL lauten.

Hier ist mein Workaround für diejenigen, die es nicht können.
Beachten Sie , dass das Ausführen sudo(command, user="otheruser") mit diesen Lösungen nicht funktioniert.

class Sudosu:
    def __init__(self, user):
        self.user = user

    def __enter__(self):
        self.old_sudo_prefix = env.sudo_prefix
        self.old_sudo_user, env.sudo_user = env.sudo_user, self.user
        env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"

    def __exit__(self, a, b, c):
        env.sudo_prefix = self.old_sudo_prefix
        env.sudo_user = self.old_sudo_user

Verwenden Sie das wie ...

<strong i="17">@task</strong>
def test():
    with Sudosu(user=username):
        sudo("whoami")

Alternativ als Dekorateur...

def sudosu(user):                                                                        
    def wrap(f):                                                                         
        def inner(*args, **kwargs):                                                      
            old_sudo_prefix = env.sudo_prefix                                            
            old_sudo_user, env.sudo_user = env.sudo_user, user                           
            env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"       

            f(*args, **kwargs)                                                           

            env.sudo_prefix = old_sudo_prefix                                            
            env.sudo_user = old_sudo_user                                                
        inner.__name__ = f.__name__                                                      
        return inner                                                                     
    return wrap                                                                          

Verwenden Sie das wie ...

<strong i="24">@task</strong>
@sudosu("username")
def whoami():
    sudo("whoami")

oder...

sudo = sudosu("username")(sudo)

<strong i="28">@task</strong>
def whoami():  
    sudo("whoami")

Wie auch immer Sie Lust haben. Meine Präferenz ist als Kontext.

Natürlich könnten Sie einfach env.sudo_prefix setzen, aber Sie müssen es zurücksetzen, wenn Sie ein normales sudo ausführen möchten.

Juchiu, ich hatte große Hoffnungen, aber das hat bei mir nicht funktioniert. Ich bekomme im Grunde den gleichen Fehler, den Fabric allein gegeben hat. Ich verwende Red Hat Enterprise Linux Server Version 5.4 (Tikanga). Die Lösung von Npalrecha funktioniert, ist aber natürlich nicht elegant.

Fehler:
Entschuldigung, Benutzer xxxx darf '/bin/su - yyyy -c -u' nicht ausführen
yyyy /bin/bash -l -c whoami' als root auf myserver.com.com.

Ausgeführt: sudo -S -p 'sudo password:' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"

Es scheint, als ob es immer noch versucht, -u yyyy an sudo zu übergeben. Ich glaube, dass Sie, wenn Sie Ihren sudo() -Anruf tätigen, immer noch user als Kwarg weitergeben.

Aber Ihre Fehlermeldung ist interessant, da es scheint, als ob Sie in sudo möglicherweise nicht berechtigt sind, su mit bestimmten Argumenten auszuführen, insbesondere da Sie normalerweise sudo su - yyyy ausführen dürfen.

FWIW, die Argumente schienen mir keinen Sinn zu ergeben, aber ich fand heraus, was seltsam war.
Sudo scheint versucht zu haben, den Befehl su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami" auszuführen. Su scheint dann zu versuchen, -u "achuser" /bin/bash -l -c "whoami" auszuführen, führt aber nur whoami aus, weil es glaubt, dass -c mehrmals übergeben wurde, und nimmt nur das letzte. Ich würde wahrscheinlich versuchen, dies zu vermeiden.

Dies ist mehr Futter für Mailinglisten als ein tatsächliches Problem mit Fabric - das als solches geschlossen wird.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen