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

使用python脚本以超级用户身份运行linux系统命令,python,linux,sysadmin,sudo,root,Python,Linux,Sysadmin,Sudo,Root,我已经在我的机器上安装了postfix,我正在通过编程(使用python)(在某些操作上)动态更新virtual_别名。更新/etc/postfix/virtual_别名中的条目后,我将运行以下命令:但我收到错误: sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile sudo: sorry, you must have a tty to run sudo 我希望以非人工方式运行上面

我已经在我的机器上安装了postfix,我正在通过编程(使用python)(在某些操作上)动态更新virtual_别名。更新/etc/postfix/virtual_别名中的条目后,我将运行以下命令:但我收到错误:

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

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

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

您可以以root用户身份运行python脚本,这样您就不需要添加重新加载后缀的权限

或者您可以将sudo配置为不需要
/etc/init.d/postfix
的密码

sudo配置(通过visudo)允许NOPASSWD:允许不使用密码的命令。看

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");
}
#包括 //gcc-o reload_postfix reload_postfix.c //chown根重新加载\u后缀 //chmod+s重新加载后缀 int main(int argc,字符**argv){ setuid(geteuid()); 系统(“/etc/init.d/postifx reload”); }

将命令包装在setuid程序中。这将允许任何用户重新启动postfix。当然,您可以进一步将执行权限限制到某些组。

要回答错误:“sudo:对不起,您必须有一个tty才能运行sudo”,我们在sudoers文件中有一个名为“Defaults requirety”的设置。我试着对它进行注释,结果是:D.

如果要在python中执行此操作,只需执行以下操作:

在调用shell命令的行之前编写此命令

os.setuid(os.geteuid())
然后,调用不带“sudo”前缀的shell命令

请参见


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

明文形式的sudo密码是个糟糕的主意,有更安全的方法。setuid位专门解决了这个问题。纯文本密码?哎呀!在/etc/sudoers中为用户或组设置NOPASSWD,这样就不需要向sudo提供密码。如果您希望在自己的个人计算机上获得快速而肮脏的解决方案,这不是一个坏主意。这在生产环境中很糟糕。我刚才说的是python脚本!因为您正在进行后缀配置更改,所以我假设这是针对服务器的,并且安全性比使用特定的编程语言要重要得多。您不能使用setuid()脚本,因为它们的执行方式不同,因此此解决方案(非常常见)。sudo被认为是获得根权限的最佳方式。它改变了将setuid位分散在整个文件系统中的想法,使之成为一个具有该功能的可执行文件(sudo),具有集中配置、更灵活的策略和可审计的使用!如何配置sudo,使其不需要在脚本(/etc/init.d/postfix reload)上单独使用密码?使sudo不需要密码是sudoers的主题,在编程问题的范围之外,sudo可以针对每个用户针对每个程序进行配置。另一种方法是在requirety前面贴一个感叹号,即“Defaults!requirety”。这样,任何阅读sudoers文件的人都可以看到,您在没有tty的情况下显式地允许sudo
os.setuid(os.geteuid())