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

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脚本运行此系统命令)。那么我该如何以编程方式运行此命令? ```html

我想以非人为方式运行提到的sudo命令(也就是说,我正在从Python脚本运行此系统命令)。那么我该如何以编程方式运行此命令?

```
6个回答

20
你可以将Python脚本本身以root权限运行,这样你就不需要添加特权来重新加载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

或类似的内容。


Douglas!我如何配置sudo,以便在那个脚本(/etc/init.d/postfix reload)中不需要密码? - Nanda Kishore
让sudo无需密码是sudoers文件的内容,并且超出了编程问题的范畴,sudo可以针对每个程序和用户进行配置。 - myroslav

3
#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。当然,您可以进一步限制执行权限以适用于某些组。


我在谈论Python脚本! - Nanda Kishore
由于您正在进行后缀配置更改,我假设这是为服务器而不是使用特定编程语言,因此安全性比使用特定编程语言更重要。您无法设置脚本的setuid(),因为它们的执行方式,因此这个解决方案(非常常见)。 - codelogic
sudo 被视为获取 root 权限的优越方式。它改变了在文件系统中分散 setuid 位的想法,转而使用具备该功能的单个可执行文件(sudo)和集中配置,更灵活的策略以及可审计的使用。 - myroslav

3
为了解决"sudo: sorry, you must have a tty to run sudo"错误,我们有一个名为"Defaults requiretty"的设置在sudoers文件中。我尝试将其注释掉,然后就可以正常运行了 :D。

另一种方法是在requiretty前面加上感叹号,即“Defaults !requiretty”。这样,任何阅读sudoers文件的人都可以看到您明确允许无需tty使用sudo。 - Ian Ellis

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

当然,这几乎总是不明智的,因为密码是明文储存的。

2
在明文中设置sudo密码是一个非常糟糕的想法,有更安全的方法。setuid位特别解决了这个问题。 - codelogic
明文密码?呃!在 /etc/sudoers 中为用户或组设置 NOPASSWD,这样就不需要提供密码给 sudo。 - Ian Ellis
1
如果你想要在自己的个人电脑上快速解决问题,这并不是一个坏主意。但是在生产环境中使用它就很糟糕了。 - answerSeeker

1
如果你想用Python来完成这个任务,应该只需执行以下操作: 在调用shell命令的那一行代码之前,输入这个命令。
os.setuid(os.geteuid())

然后,您可以调用Shell命令而不带“sudo”前缀。

0

请查看StackLick

您需要授权用户在不需要密码的情况下运行sudo命令


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接