面料差异sudo()运行('sudo cmd')

时间:2016-07-13 07:25:42

标签: python sudo fabric

我想知道函数sudo()和函数run('sudo -u user smth')

之间的区别是什么

在doc上有:

  

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

但有一段时间,sudo('cmd')提示我输入密码,但如果我使用run('sudo cmd')切换,则无需提示任何操作。这两者之间有什么变化吗? (我记得有人在说sudorun(sudo cmd)不同用,但我找不到它了。

2 个答案:

答案 0 :(得分:2)

我发现了这两个区别。

1:Fabric maintains an in-memory password

2:sudo accepts additional user and group arguments

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

其次,如果你想执行一个不在root下的命令,而是像www这样的其他用户组,你只需要设置env.sudo_user =' www'或sudo(' cmd',user =' www')。第一个将在www下执行每个sudo(),第二个将在www下执行这个单个cmd。但是,当使用run()命令时,您需要编辑以运行(" sudo -u' cm' 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.

答案 1 :(得分:1)

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

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

--prompt-for-sudo-password