2016-07-13 42 views
1

我不知道是什麼樣的功能sudo()和功能run('sudo -u user smth')面料差須藤()運行(「須藤CMD」)

DOC上存在的區別是:

須藤是相同的以各種方式運行,除了它總會將 給定的命令包含在sudo程序的調用中以提供超級用戶 的權限。

但過一段時間,sudo('cmd')提示我輸入密碼,但如果我用run('sudo cmd')切換它的工作原理,而不會提示我什麼。兩者之間有什麼變化嗎? (我記得有人在SO說sudorun(sudo cmd)不是爲了同樣的用途,但我找不到它回來)

回答

1

我發現這兩個區別。

1:Fabric maintains an in-memory password

2:sudo accepts additional user and group arguments

首先,面料從緩存中使用sudo(時)將獲得的密碼,那麼你就需要輸入密碼。但是如果你使用run('sudo cmd'),你需要輸入每個'sudo cmd'的密碼。其次,如果你想執行一個不在根目錄下的命令,但是像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.