Есть ли способ имитировать команду «sudo su - user_name», а затем выполнять нужные мне команды?
Пробовал run
и sudo
и к сожалению нет возможности это сделать. Пожалуйста помоги
Является ли «-» важным в том, что вы пытаетесь сделать? (например, вызвать логин) или вы просто пытаетесь запустить команду от имени другого пользователя, отличного от текущего пользователя и 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 был передан несколько раз, и просто берет последний. Я бы, наверное, постарался избежать этого.
Это больше корм для списка рассылки, чем реальная проблема с тканью - как таковая будет закрыта.
Самый полезный комментарий
@polusok @kusnier Я работаю с аналогичными ограничениями. вы можете попробовать передать свои команды таким образом.
run('echo "whoami" | sudo su - имя пользователя')