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

时间:2009-02-24 19:32:21

标签: python linux sysadmin sudo root

我的机器上安装了postfix,我正在以编程方式(使用python)动态更新virtual_alias(在某些操作上)。一旦我更新/ 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脚本运行此系统命令。)。那么如何以编程方式运行此命令?

6 个答案:

答案 0 :(得分:20)

您可以以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

或类似的东西。

答案 1 :(得分: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程序中包装您的命令。这将让任何用户重新启动postfix。您当然可以进一步限制对某些组的执行权限。

答案 2 :(得分:3)

要回答错误:“sudo:抱歉,你必须有一个tty来运行sudo”,我们在sudoers文件中有一个名为“Defaults requiretty”的设置。我试着将它评论出来并且有效:D。

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

如果您要在python中执行此操作,则应执行以下操作:

在您调用shell命令的行

之前写入此命令
os.setuid(os.geteuid())

然后,调用没有“sudo”前缀的shell命令

答案 5 :(得分:0)

请参见StackLick

您需要授予用户无需密码即可运行 sudo命令的功能。