代码之家  ›  专栏  ›  技术社区  ›  mipadi

我能阻止fabric提示我输入sudo密码吗?

  •  47
  • mipadi  · 技术社区  · 14 年前

    Fabric sudo blah 命令执行时不提示输入密码。当我试图通过Fabric的 sudo 函数时,系统会提示我输入密码。这是因为Fabric在使用 苏多 :

    sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"
    

    /bin/bash 没有密码。

    我已经通过使用 run("sudo blah") sudo("blah") ,但我想知道是否有更好的解决办法。是否有解决此问题的方法?

    8 回复  |  直到 14 年前
        1
  •  32
  •   Sam Dolan    14 年前

    试着传球 shell=False sudo('some_command', shell=False)

    fabric/operations.py :

    if (not env.use_shell) or (not shell):
        real_command = "%s %s" % (sudo_prefix, _shell_escape(command))
    

    else块如下所示:

                                                 # V-- here's where /bin/bash is added
    real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
        _shell_escape(cwd + command))
    
        2
  •  13
  •   Scott Prive    8 年前

    实际上,您并没有遇到问题;您误解了Fabric run()和sudo()的工作方式。

    下面是一组简单的规则: 1) 如果不需要提示,请使用“run()”。 2) 如果确实需要提示,请使用“sudo()”。(对于需要提示的所有或大多数命令都应该如此,即使所讨论的可执行文件不是Bash或Sudo)。

    同样的答案也适用于那些试图在“sudo”下运行命令的人。即使sudoers在某些系统上为当前用户提供了无密码配置,如果使用sudo()而不是run(),则会强制提示(除非结构代码已经包含ENV密码或密钥)。

    顺便说一句,《织物》的作者在IRC中回答了我的问题——与你的问题非常相似。不错的家伙,开源的无名英雄之一,因为他坚持他的结构和Paramiko工作。

    …在我的测试环境中,总有一个用户名对sudo具有完全无密码的访问权限。打字 sudo echo hello 不会提示我的。此外,该sudo用户配置为“!requiretty”,这样所有命令都可以在SSH上运行(比如主机之间的SSH跳转)。这意味着我可以简单地使用“run()”和来执行“sudo something”,但这只是另一个运行时没有提示的命令。就安全性而言,锁定生产主机而不是测试主机是某人的工作。(如果您被迫进行测试,并且无法自动化,这是一个巨大的问题)。

        3
  •  13
  •   Delgan    4 年前

    您可以使用:

    from fabric.api import env
    # [...]
    env.password = 'yourpassword'
    
        4
  •  6
  •   sebastian serrano    13 年前

    user ALL=NOPASSWD: some_command
    

    其中user是sudo用户,some\ u command是要使用fabric运行的命令,然后在fabric脚本上运行sudo it with shell=False:

    sudo('some_command', shell=False)
    

    这对我有用

        5
  •  2
  •   CanSpice    14 年前

    在你的 /etc/sudoers 文件,您可以添加

    user ALL=NOPASSWD: /bin/bash
    

    user 是您的结构用户名。

    /etc/苏多尔 只能由根用户写入。

    /bin/bash 基本上让您可以访问任何内容,因此如果您没有root访问权限并且必须请求系统管理员为您执行此操作,那么他们可能不会。

        6
  •  1
  •   fiat    12 年前

    但我在尝试将graphite fabric安装到ec2ami时发现了这个问题。Fabric不断提示输入根密码。

    最后的诀窍是将ssh私钥文件传递给fabric。

    fab -i key.pem graphite_install -H root@servername
    
        7
  •  1
  •   Community Egal    7 年前

    您还可以对多台计算机使用密码:

    from fabric import env
    env.hosts = ['user1@host1:port1', 'user2@host2.port2']
    env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'}
    

    看看这个答案: https://stackoverflow.com/a/5568219/552671

        8
  •  0
  •   Community Egal    7 年前

    answer 令人困惑。

    支持的实现方法是使用 env.sudo_prefix ,由 this github commit this PR )

    我的使用示例:

    env.sudo_prefix = 'sudo '