我想知道函数sudo()
和函数run('sudo -u user smth')
在doc上有:
sudo在各方面都是相同的,除了它总是会换行 调用sudo程序中的给定命令以提供超级用户 特权。
但有一段时间,sudo('cmd')
提示我输入密码,但如果我使用run('sudo cmd')
切换,则无需提示任何操作。这两者之间有什么变化吗? (我记得有人在说sudo
和run(sudo cmd)
不同用,但我找不到它了。
答案 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