18

我已经在我的机器上安装了 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 脚本运行这个系统命令。)。那么如何让这个命令以编程方式运行呢?

4

6 回答 6

20

您可以以 root 身份运行您的 python 脚本 - 然后您不需要添加权限来重新加载后缀。

或者您可以将 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

或类似的东西。

于 2009-02-24T19:39:15.337 回答
4
#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。您当然可以进一步限制某些组的执行权限。

于 2009-02-24T19:43:44.810 回答
3

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

于 2009-03-06T13:20:55.133 回答
2
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

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

于 2009-02-24T19:38:21.300 回答
1

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

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

os.setuid(os.geteuid())

然后,您调用不带“sudo”前缀的 shell 命令

于 2013-02-17T20:46:23.590 回答
0

StackLick

您需要授予用户在没有密码的情况下运行sudo 命令。

于 2018-10-11T07:59:42.263 回答