以超级用户身份运行一个linux系统命令,使用python脚本

我已经得到了我的机器上安装的后缀,我正在以编程方式更新virtual_alias(使用Python)(在一些行动)。 一旦我更新/ etc / postfix / virtual_alias中的条目,我正在运行命令:

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脚本运行这个系统命令)。 那么如何让这个命令以编程方式运行?

Solutions Collecting From Web of "以超级用户身份运行一个linux系统命令,使用python脚本"

你可以运行你自己的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 

或类似的东西。

 #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程序包装你的命令。 这将让任何用户重新启动后缀。 您当然可以进一步限制执行权限到某些组。

要回答这个错误:“sudo:对不起,你必须有一个tty来运行sudo”,我们在sudoers文件中有一个名为“Defaults requiretty”的设置。 我试着评论它,它的工作:D。

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

这当然几乎总是不是一个好主意,因为密码是纯文本的。

如果你要在python中这样做,你应该做下面的事情:

在你调用shell命令的行之前写下这个命令

 os.setuid(os.geteuid()) 

那么你可以调用没有“sudo”前缀的shell命令