Ich fand diese beiden Unterschied.
1: Fabric maintains an in-memory password
2: sudo accepts additional user and group arguments
Zuerst Stoff würde Kennwort aus dem Cache erhalten, wenn sudo() verwenden, dann müssen Sie nicht Ihr Kennwort einzugeben. Aber wenn Sie run ('sudo cmd') verwenden, müssen Sie für jedes 'sudo cmd' ein Passwort eingeben.
Zweitens, wenn Sie einen Befehl nicht unter root, sondern andere Benutzergruppe wie www ausführen möchten, müssen Sie nur env.sudo_user = 'www' oder sudo ('cmd', user = 'www') setzen. Der erste würde jedes sudo() unter www ausführen, der zweite würde diesen einzelnen cmd unter www ausführen. Aber Sie müssen zur Ausführung ("sudo -u 'www' cmd") bearbeiten, wenn Sie run() verwenden.
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.