有没有办法模仿“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'
或者如果登录很重要(hacky方式)你可以这样做我猜......
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,你需要重新设置它。
Juchiu,我寄予厚望,但这对我没有用。 我基本上得到了与织物单独给出的相同的错误。 我使用的是 Red Hat Enterprise Linux Server 5.4 (Tikanga)。 Npalrecha 的解决方案很有效,当然它并不优雅。
错误:
对不起,用户xxxx不允许执行'/bin/su - yyyy -c -u
yyyy /bin/bash -l -c whoami' 在 myserver.com.com 上以 root 身份。
执行: 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 - 用户名')