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
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
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.
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')