![](/img/trans.png)
[英]run Python script as a system command from terminal like “ls” in linux OS
[英]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 命令
您需要授予用户在没有密码的情况下运行sudo 命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.