Est-il possible d'imiter la commande "sudo su - user_name" puis d'exécuter les commandes dont j'avais besoin ?
J'ai essayé run
et sudo
et malheureusement il n'y a aucun moyen de le faire. S'il vous plaît aider
Le '-' est-il important dans ce que vous essayez de faire ? (par exemple, invoquer une connexion) ou essayez-vous simplement d'exécuter une commande en tant qu'utilisateur différent de l'utilisateur et de la racine actuels ?
Si l'effet de la connexion n'est pas important, vous pouvez procéder comme suit...
sudo("mkdir /var/www/new_docroot", user="www-data")
ou
with settings(sudo_user='mysql'):
sudo("whoami") # prints 'mysql'
ou si la connexion est importante (manière hacky), vous pouvez le faire, je suppose ...
sudo("su - usernaeme -c 'command to be run'")
Oui - est important pour moi. je dois mettre en oeuvre
Veuillez noter que je n'ai que le mot de passe de mon compte et que je n'ai pas de mot de passe pour ces utilisateurs à l'étape 2, donc je dois me connecter via
sudo su - user_name
Malheureusement, je ne peux pas l'utiliser car il est interdit en raison de mes autorisations
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.
D'autres suggestions?
@polusok : Avez-vous trouvé une solution de contournement ? J'ai le même problème. Je ne peux utiliser que sudo su - jboss
pour devenir utilisateur de jboss.
@polusok @kusnier Je travaille avec des restrictions similaires. vous pouvez essayer de transmettre vos commandes de cette façon.
run('echo "whoami" | sudo su - nom d'utilisateur')
npalrecha, cela semble fonctionner mais demande le mot de passe sur chaque commande. N'y a-t-il vraiment aucun moyen de simplement sudo su - user et d'exécuter toutes les commandes suivantes en tant qu'utilisateur?
J'ai eu le même problème... Si vous pouvez modifier le fichier /etc/sudoers
, c'est probablement la solution la plus simple. Votre ligne lit probablement username host = ALL
mais devrait lire username host = (ALL) ALL
.
Voici ma solution de contournement pour ceux qui ne peuvent pas.
Notez que faire sudo(command, user="otheruser")
avec ces solutions ne fonctionnera pas.
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
Utilisez-le comme...
<strong i="17">@task</strong>
def test():
with Sudosu(user=username):
sudo("whoami")
Sinon, en tant que décoratrice...
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
Utilisez-le comme...
<strong i="24">@task</strong>
@sudosu("username")
def whoami():
sudo("whoami")
ou...
sudo = sudosu("username")(sudo)
<strong i="28">@task</strong>
def whoami():
sudo("whoami")
Quelle que soit la façon dont vous vous sentez. Ma préférence va selon le contexte.
Bien sûr, vous pouvez simplement définir env.sudo_prefix
, mais vous devrez le réinitialiser si vous voulez faire un sudo normal.
Juchiu, j'avais de grands espoirs mais cela n'a pas fonctionné pour moi. J'obtiens essentiellement la même erreur que le tissu seul donnait. Je suis sur Red Hat Enterprise Linux Server version 5.4 (Tikanga). La solution de Npalrecha fonctionne, ce n'est tout simplement pas élégant bien sûr.
Erreur:
Désolé, l'utilisateur xxxx n'est pas autorisé à exécuter '/bin/su - yyyy -c -u
yyyy /bin/bash -l -c whoami' en tant que root sur myserver.com.com.
Exécuté : sudo -S -p 'mot de passe sudo :' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
Il semble qu'il essaie toujours de passer -u yyyy
à sudo. Je crois que lorsque vous effectuez votre appel sudo()
, vous passez toujours user
en tant que kwarg.
Mais votre message d'erreur est intéressant, car il semble que vous ne soyez peut-être pas autorisé dans sudo à exécuter su avec certains arguments, en particulier puisque vous êtes autorisé à sudo su - yyyy
normalement.
FWIW, les arguments ne semblaient pas avoir de sens pour moi, mais j'ai compris ce qui était bizarre.
Sudo semble avoir essayé d'exécuter la commande su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
. Su semble alors essayer d'exécuter -u "achuser" /bin/bash -l -c "whoami"
, mais n'exécute que whoami
car il pense que -c a été passé plusieurs fois, et il ne prend que le dernier. J'essaierais probablement d'éviter que cela se produise.
C'est plus du fourrage pour la liste de diffusion qu'un problème réel avec le tissu - va fermer en tant que tel.
Commentaire le plus utile
@polusok @kusnier Je travaille avec des restrictions similaires. vous pouvez essayer de transmettre vos commandes de cette façon.
run('echo "whoami" | sudo su - nom d'utilisateur')