Fabric: 如何实现“sudo su -”调用?

创建于 2013-10-29  ·  9评论  ·  资料来源: fabric/fabric

有没有办法模仿“sudo su - user_name”命令然后执行我需要的命令?

尝试runsudo ,不幸的是没有办法做到这一点。 请帮忙

最有用的评论

@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'

或者如果登录很重要(hacky方式)你可以这样做我猜......

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

是的——对我来说很重要。 我需要实施

  • 使用我的凭据登录到服务器
  • 在 shell 中以具有特定权限和配置环境的另一个用户身份登录
  • 执行命令

请注意,我只有我的帐户密码,并且在第 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 被多次传递,它只需要最后一个。 我可能会尽量避免这种情况发生。

这更像是邮件列表的素材,而不是织物的实际问题——因此将关闭。

此页面是否有帮助?
0 / 5 - 0 等级