繁体   English   中英

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

[英]Run a linux system command as a superuser, using a python script

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

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

或类似的东西。

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

要回答错误:“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 命令

StackLick

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM