2009-02-24 21 views
16

Tengo postfix instalado en mi máquina y estoy actualizando virtual_alias sobre la marcha programáticamente (usando python) (en alguna acción). Una vez que actualizar la entrada en el directorio/etc/postfix/virtual_alias, estoy ejecutando el comando: Ejecutar un comando del sistema linux como superusuario, usando una secuencia de comandos python

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
Pero estoy consiguiendo el error:
sudo: sorry, you must have a tty to run sudo

Quiero ejecutar el comando sudo mencionado en una forma no humana (es decir, Estoy ejecutando este comando de sistema desde un script de python). Entonces, ¿cómo puedo ejecutar este comando programáticamente?

Respuesta

19

Puede ejecutar su secuencia de comandos de python como la propia raíz; entonces no tendrá que agregar privilegios para volver a cargar postfix.

O puede configurar sudo para no necesitar una contraseña para /etc/init.d/postfix.

sudo configuration (via visudo) permite NOPASSWD: permitir el comando sin una contraseña. Ver http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

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

o algo similar.

+0

+1: hacer el sudo fuera de la secuencia de comandos de Python. –

+0

Douglas! ¿Cómo configuro sudo para que no necesite una contraseña en ese script (/etc/init.d/postfix reload) solo? –

+0

Hacer que sudo no necesite passwork está sujeto a sudoers, y fuera del alcance de la pregunta de programación, sudo se puede configurar por programa por usuario. – myroslav

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

Por supuesto, esto no es casi siempre una buena idea ya que la contraseña está en texto plano.

+2

Una contraseña de sudo en texto plano es una idea TERRIBLE, existen formas mucho más seguras. El bit de setuid aborda específicamente esta preocupación. – codelogic

+0

¿Clave de texto sin formato? Eeek! Establezca NOPASSWD en/etc/sudoers para el usuario o grupo, por lo que no será necesario ingresar ninguna contraseña para sudo. –

+0

No es una mala idea si quieres una solución rápida y sucia en tu computadora personal. Es malo en un entorno de producción. – answerSeeker

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"); 
} 

Envuelva su comando en el programa setuid-ed. Esto permitirá que cualquier usuario reinicie postfix. Por supuesto, puede restringir aún más el permiso de ejecución para ciertos grupos.

+0

¡Estaba hablando de la secuencia de comandos python! –

+0

Como está haciendo cambios de configuración de postfix, asumí que esto es para un servidor y que la seguridad sería mucho más importante que usar un lenguaje de programación específico. No se pueden establecer guiones setuid() debido a la forma en que se ejecutan, de ahí esta solución (una muy común). – codelogic

+0

sudo se considera una forma superior de obtener privilegios de root. Cambia la idea de dispersar bits de setuid a través del sistema de archivos en ejecutable único capaz de esa funcionalidad (sudo) con configuración central, políticas más flexibles con uso audible. – myroslav

3

Para responder al error: "sudo: lo siento, debe tener un tty para ejecutar sudo", tenemos una configuración llamada "Defaults requiretty" en el archivo sudoers. Intenté comentarlo y funcionó: D.

+0

La otra forma es colocar un signo de exclamación delante de requiretty, es decir, "Defaults! Requiretty". De esta forma, cualquier persona que lea el archivo sudoers puede ver que está permitiendo explícitamente sudo sin un tty –

0

si vamos a hacer esto en Python que sólo debe hacer lo siguiente:

escribir este comando antes de la línea que llama al comando shell

os.setuid(os.geteuid()) 

a continuación, se llama al comando shell sin el prefijo "sudo"

Cuestiones relacionadas