结构差异 sudo() run('sudo cmd')

pwn*_*uce 5 python sudo fabric

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

在文档上有:

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

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

小智 5

我发现这两个区别。

1:Fabric 维护内存中的密码

2: sudo 接受额外的用户和组参数

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

其次,如果你想在其他用户组(例如www)下执行命令而不是root下,则只需设置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.
Run Code Online (Sandbox Code Playgroud)