2016-07-13 18 views
1

Ich frage mich, was ist der Unterschied zwischen der Funktion sudo() und die Funktion run('sudo -u user smth')Stoff Unterschied sudo() run ('sudo cmd')

Auf der doc ist:

sudo ist identisch in jedem Fall zu laufen, außer dass es immer den den angegebenen Befehl in einem Aufruf an das sudo-Programm umschlingt, um Superuser Privilegien bereitzustellen.

Aber ein paar Mal, sudo('cmd') mir ein Passwort gefragt, aber wenn ich mit run('sudo cmd') Schalter funktioniert es ohne mich etwas zu fragen. Gibt es etwas, das sich zwischen den beiden ändert? (Ich erinnere mich an jemanden auf SO sagen, dass sudo und run(sudo cmd) sind nicht für den gleichen Zweck, aber ich kann es nicht finden zurück)

Antwort

1

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.