【问题标题】:fabric difference sudo() run('sudo cmd')面料差异 sudo() run('sudo command')
【发布时间】:2018-12-29 18:53:17
【问题描述】:

我想知道函数sudo()和函数run('sudo -u user smth')有什么区别

文档上有:

sudo 在所有运行方式上都是相同的,除了它总是会换行 调用 sudo 程序中的给定命令以提供超级用户 特权。

但有几次,sudo('cmd') 提示我输入密码,但如果我用run('sudo cmd') 切换,它不会提示我任何东西。两者之间有什么变化吗? (我记得SO上有人说sudorun(sudo cmd)用途不同,但我找不到了)

【问题讨论】:

    标签: python sudo fabric


    【解决方案1】:

    我发现这两个不同。

    1:Fabric maintains an in-memory password

    2:sudo accepts additional user and group arguments

    首先,fabric 在使用 sudo() 时会从缓存中获取密码,然后你就不需要输入密码了。但是如果你使用run('sudo cmd'),你需要为每个'sudo cmd'输入密码。

    其次,如果你想执行的命令不是在root下,而是在其他用户组,比如www,你只需要设置env.sudo_user = 'www'或者sudo('cmd', user='www')。第一个将在 www 下执行每个 sudo(),第二个将在 www 下执行这个单个 cmd。但是使用 run() 命令时需要编辑 run("sudo -u 'www' cmd")。

    from fabric.api import sudo, run, env
    
    env.hosts = ['host_ip',]
    env.user = 'user_name'
    env.sudo_user = 'sudo_user'
    
    
    def test_1():
        run('sudo pwd')
    
    def test_2():
        sudo('pwd')
    
    
    
    $ fab -I --show=debug test_1 test_2
    Initial value for env.password:   # enter password
    Commands to run: test_1, test_2
    Parallel tasks now using pool size of 1
    [ip_address] Executing task 'test_1'
    [ip_address] run: /bin/bash -l -c "sudo pwd"
    [ip_address] out: [sudo] password for billy:   # needs to enter password here
    [ip_address] out: /home/billy
    [ip_address] out: 
    
    Parallel tasks now using pool size of 1
    [ip_address] Executing task 'test_2'
    [ip_address] sudo: sudo -S -p 'sudo password:'  -u "root"  /bin/bash -l -c  "pwd"
    [ip_address] out: sudo password:  # only prompt, do not need enter password
    [ip_address] out: /home/billy
    [ip_address] out: 
    
    
    Done.
    Disconnecting from ip_address... done.
    

    【讨论】:

      【解决方案2】:

      从 Fabric 2 开始,您可以通过 run() 调用 sudo,除非您使用自动回复 details here,否则它将提示输入密码。请注意,sudo 命令通常会远程缓存密码,因此在同一连接期间下次调用sudo 将不会提示输入密码。

      但是,Fabric sudo() 助手使sudo 的使用更加容易,details here。您需要确保填写sudo.password 配置值(通过配置对象、配置文件、环境变量或--prompt-for-sudo-password)。以下是我使用 keyring 模块的方法:

      from fabric import task
      import keyring
      
      @task
      def restart_apache(connection):
          # set the password with keyring.set_password('some-host', 'some-user', 'passwd')
          connection.config.sudo.password = keyring.get_password(connection.host, 'some-user')
          connection.sudo('service apache2 restart')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2017-02-20
        • 2013-01-26
        • 2013-07-24
        相关资源
        最近更新 更多