2016-07-13 3 views
1

мне интересно, в чем разница между функцией sudo() и функциями run('sudo -u user smth')ткань разница Судо() бежать («Судо CMD»)

На документе есть:

Судо идентично во всяком случае, за исключением того, что он всегда будет обертывать данной командой при вызове программы sudo, чтобы предоставить привилегии суперпользователя .

Но несколько раз, sudo('cmd') подскажите мне пароль, но если я переключаюсь с run('sudo cmd') он работает без подсказки мне что-нибудь. Есть ли что-то, что меняется между ними? (Я помню, что кто-то на SO сказал, что sudo и run(sudo cmd) не предназначены для использования, но я не могу найти его обратно)

ответ

1

Я нашел эти две отличия.

1: Fabric maintains an in-memory password

2: sudo accepts additional user and group arguments

Во-первых, ткань будет получить пароль из кэша при использовании Sudo(), то вам не нужно вводить пароль. Но если вы используете run ('sudo cmd'), вам нужно ввести пароль для каждого 'sudo cmd'.

Во-вторых, если вы хотите выполнить команду не под root, а другую группу пользователей, такую ​​как www, вам просто нужно установить env.sudo_user = 'www' или sudo ('cmd', user = 'www'). Первый выполнил бы каждый sudo() под www, второй выполнил бы этот единственный cmd под www. Но вам нужно отредактировать для запуска ("sudo -u 'www' cmd") при использовании команды run().

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.