我的机器上安装了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脚本运行此系统命令。)。那么如何以编程方式运行此命令?
答案 0 :(得分:20)
您可以以root用户身份运行python脚本 - 然后您不需要添加权限来重新加载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
或类似的东西。
答案 1 :(得分:5)
#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。您当然可以进一步限制对某些组的执行权限。
答案 2 :(得分:3)
要回答错误:“sudo:抱歉,你必须有一个tty来运行sudo”,我们在sudoers文件中有一个名为“Defaults requiretty”的设置。我试着将它评论出来并且有效:D。
答案 3 :(得分:2)
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")
当然,这通常不是一个好主意,因为密码是纯文本的。
答案 4 :(得分:0)
如果您要在python中执行此操作,则应执行以下操作:
在您调用shell命令的行
之前写入此命令os.setuid(os.geteuid())
然后,调用没有“sudo”前缀的shell命令
答案 5 :(得分:0)
请参见StackLick
您需要授予用户无需密码即可运行 sudo命令的功能。