我想知道函数sudo()和函数run('sudo -u user smth')之间有什么区别
在医生身上有:
sudo在所有运行方式上都是相同的,只不过它总是在调用sudo程序时包装给定的命令,以提供超级用户权限。
但是有几次,sudo('cmd')会提示我一个密码,但是如果我用run('sudo cmd')进行切换,它就不会提示我任何提示。两者之间有什么变化吗?(我记得有人这样说过,sudo和run(sudo cmd)的用途不同,但我找不到)
发布于 2017-01-11 12:27:58
我发现了这两个不同之处。
1:Fabric维护内存中的密码。
2:sudo接受其他用户和组参数。
首先,当使用sudo()时,fabric将从缓存中获取密码,然后不需要输入密码。但是,如果使用run('sudo‘),则需要为每个“sudo”输入密码。
其次,如果您想执行一个命令,而不是在根用户下执行命令,而是执行其他用户组,比如www,您只需要设置env.sudo_user = 'www‘或sudo('cmd',user='www')。第一个将在www下执行每个sudo(),第二个将在www下执行这个单个cmd。但是当使用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.发布于 2018-12-28 21:47:13
从Fabric 2开始,您可以通过run()调用run(),除非使用自动响应程序这里的细节,否则会提示输入密码。请注意,sudo命令通常远程缓存密码,因此在同一连接期间对sudo的下一次调用将不会提示输入密码。
然而,Fabric sudo()助手使得使用sudo更加容易,这里的细节。您需要确保sudo.password配置值被填充(通过配置对象、配置文件、环境变量或--prompt-for-sudo-password)。下面是我如何处理钥匙圈模块的方法:
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')https://stackoverflow.com/questions/38345184
复制相似问题