2009-02-24 160 views
16

我的機器上安裝了postfix,我正在以編程方式更新virtual_alias(使用python)(在某些操作上)。一旦我更新/ etc/postfix/virtual_alias中的條目,我正在運行命令:使用python腳本以超級用戶身份運行linux系統命令

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
但我得到錯誤:
sudo: sorry, you must have a tty to run sudo

我想以非人爲的方式運行提到的sudo命令(意思是說,我從python腳本運行這個系統命令。)。那麼如何讓這個命令以編程方式運行?

回答

19

您可以以root身份運行您的python腳本 - 那麼您將不需要添加特權來重新加載postfix。

或者您可以配置sudo以使其不需要密碼/etc/init.d/postfix

sudo配置(通過visudo)允許NOPASSWD:允許沒有密碼的命令。見http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username> ALL = NOPASSWD: /etc/init.d/postfix 

或類似的東西。

+0

+1:在Python腳本之外執行sudo。 – 2009-02-24 20:08:38

2
import os 
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword") 

這當然幾乎總是不是一個好主意,因爲密碼是純文本的。

+2

純文本中的sudo密碼是一個可怕的想法,有更安全的方法。 setuid位專門解決了這個問題。 – codelogic 2009-02-24 19:50:39

+0

純文本密碼? Eeek!在/ etc/sudoers中爲用戶或組設置NOPASSWD,所以不需要爲sudo提供密碼。 – 2016-02-13 00:00:19

+0

如果你想在自己的個人電腦上使用一個快速而骯髒的解決方案,這並不是什麼壞主意。這在生產環境中很糟糕。 – answerSeeker 2017-01-05 18:44:22

5
#include <unistd.h> 
#include <stdlib.h> 

// gcc -o reload_postfix reload_postfix.c 
// chown root reload_postfix 
// chmod +s reload_postfix 

int main(int argc, char **argv) { 
    setuid(geteuid()); 
    system("/etc/init.d/postifx reload"); 
} 

將你的命令包裹在setuid-ed程序中。這將讓任何用戶重新啓動後綴。您當然可以進一步限制對某些組的執行權限。

3

要回答錯誤:「sudo:對不起,您必須有tty才能運行sudo」,我們在sudoers文件中有一個名爲「Defaults requiretty」的設置。我試着評論它,它的工作:D。

0

,如果你要做到這在Python你應該做到以下幾點:

寫您致電shell命令

os.setuid(os.geteuid()) 

然後前行此命令,調用shell命令沒有「sudo」前綴

相關問題