views:

2325

answers:

4

I have got postfix installed on my machine and I am updating virtual_alias on the fly programmatically(using python)(on some action). Once I update the entry in the /etc/postfix/virtual_alias, I am running the command:

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
But I am getting the error:
sudo: sorry, you must have a tty to run sudo

I want to run the mentioned sudo command in a non-human way(meaning, I am running this system command from a python script.). So how do I get this command run programmatically?

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

This of course is almost always not a good idea as the password is in plain text.

CTT
A sudo password in plaintext is a TERRIBLE idea, there are far more secure ways. The setuid bit specifically addresses this concern.
codelogic
+14  A: 

You can either run your python script as root itself - then you won't need to add privilege to reload postfix.

Or you can configure sudo to not need a password for /etc/init.d/postfix.

sudo configuration (via visudo) allows NOPASSWD: to allow the command without a password. See http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username>  ALL = NOPASSWD: /etc/init.d/postfix

or something similar.

Douglas Leeder
+1: do the sudo outside the Python script.
S.Lott
Douglas! How do I configure sudo to not need a password on that script(/etc/init.d/postfix reload) alone?
Maddy
Making sudo need not passwork is subject of sudoers, and out of the scope of programming question, sudo can be configured per program per user.
myroslav
@Maddy "sudo visudo"
Nerdling
Thankyou Douglas :D
Maddy
+4  A: 
#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");
}

Wrap your command in setuid-ed program. This will let any user restart postfix. You can of course further restrict the execute permission to certain groups.

codelogic
I was talking about python script!
Maddy
Since you're making postfix configuration changes, I assumed this is for a server and that security would be far more important than using a specific programming language. You can't setuid() scripts because of the way they are executed, hence this solution (a very common one).
codelogic
sudo is considered be superior way to gain root privileges. It changes idea of scattering setuid bits across filesystem to single executable capable of that functionality (sudo) with central configuration, more flexible policies with audit-able usage.
myroslav
+1  A: 

To answer the error:"sudo: sorry, you must have a tty to run sudo", we have a setting called "Defaults requiretty" in sudoers file. I tried commenting it out and it worked :D.

Maddy