Fabric: Как реализовать вызов «sudo su -»?

Созданный на 29 окт. 2013  ·  9Комментарии  ·  Источник: fabric/fabric

Есть ли способ имитировать команду «sudo su - user_name», а затем выполнять нужные мне команды?

Пробовал run и sudo и к сожалению нет возможности это сделать. Пожалуйста помоги

Самый полезный комментарий

@polusok @kusnier Я работаю с аналогичными ограничениями. вы можете попробовать передать свои команды таким образом.

run('echo "whoami" | sudo su - имя пользователя')

Все 9 Комментарий

Является ли «-» важным в том, что вы пытаетесь сделать? (например, вызвать логин) или вы просто пытаетесь запустить команду от имени другого пользователя, отличного от текущего пользователя и root?

Если влияние входа в систему не важно, вы можете сделать следующее...

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

или

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

или если вход в систему важен (хакерский способ), вы могли бы сделать это, я думаю...

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

Да - важно для меня. мне нужно реализовать

  • войти на сервер с моими учетными данными
  • в оболочке войдите в систему как другой пользователь с определенным разрешением и настроенной средой
  • выполнить команду

Обратите внимание, что у меня есть только пароль моей учетной записи, и у меня нет пароля для этого пользователя на шаге 2, поэтому мне нужно подключиться через

sudo su - user_name

К сожалению, я не могу использовать его, так как это запрещено из-за моих разрешений.

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.

Любые другие предложения?

@polusok : Вы нашли обходной путь? У меня та же проблема. Я могу использовать только sudo su - jboss , чтобы стать пользователем jboss.

@polusok @kusnier Я работаю с аналогичными ограничениями. вы можете попробовать передать свои команды таким образом.

run('echo "whoami" | sudo su - имя пользователя')

npalrecha, это работает, но запрашивает пароль для каждой команды. Неужели нет способа просто sudo su - user и запускать все последующие команды от имени этого пользователя?

У меня была та же проблема... Если вы можете изменить файл /etc/sudoers , это, вероятно, самое простое решение. Ваша строка, вероятно, выглядит как username host = ALL , но должна читаться как username host = (ALL) ALL .

Вот мой обходной путь для тех, кто не может.
Обратите внимание , что выполнение sudo(command, user="otheruser") с этими решениями не сработает.

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

Используйте это как...

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

Или как декоратор...

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                                                                          

Используйте это как...

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

или...

sudo = sudosu("username")(sudo)

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

Как вам угодно. Я предпочитаю контекст.

Конечно, вы можете просто установить env.sudo_prefix , но вам нужно будет сбросить его, если вы хотите выполнить обычный sudo.

Джучиу, у меня были большие надежды, но это не сработало для меня. В основном я получаю ту же ошибку, что и ткань. Я использую Red Hat Enterprise Linux Server версии 5.4 (Tikanga). Решение Npalrecha работает, но, конечно, не элегантно.

Ошибка:
Извините, пользователю xxxx не разрешено выполнять '/bin/su -yyyy -c -u
yyyy /bin/bash -l -c whoami' от имени пользователя root на myserver.com.com.

Выполнено: sudo -S -p 'пароль sudo:' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"

Кажется, что он все еще пытается передать -u yyyy в sudo. Я считаю, что когда вы делаете свой sudo() колл, вы все равно передаете user как kwarg.

Но ваше сообщение об ошибке интересно, так как кажется, что вам не разрешено в sudo выполнять su с определенными аргументами, особенно, поскольку вам разрешено обычно sudo su - yyyy .

FWIW, аргументы казались мне бессмысленными, но я понял, что было странным.
Sudo, похоже, пытался выполнить команду su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami" . Затем Su, кажется, пытается выполнить -u "achuser" /bin/bash -l -c "whoami" , но выполняет только whoami , потому что думает, что -c был передан несколько раз, и просто берет последний. Я бы, наверное, постарался избежать этого.

Это больше корм для списка рассылки, чем реальная проблема с тканью - как таковая будет закрыта.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

jmcgrath207 picture jmcgrath207  ·  5Комментарии

peteruhnak picture peteruhnak  ·  4Комментарии

neemxyang picture neemxyang  ·  6Комментарии

26huitailang picture 26huitailang  ·  3Комментарии

TimotheeJeannin picture TimotheeJeannin  ·  3Комментарии