2009-02-24 163 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”前缀

相关问题