Pregunta

postfix

tengo instalado en mi máquina y estoy actualizando virtual_alias sobre la marcha mediante programación (utilizando Python) (en alguna medida). Una vez que actualizar la entrada en el directorio / etc / postfix / virtual_alias, estoy ejecutando el comando:

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
But 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 del sistema desde un script en Python.). Entonces, ¿cómo puedo obtener esta orden de marcha mediante programación?

¿Fue útil?

Solución

Se puede ejecutar la secuencia de comandos de Python como root en sí -., Entonces no tendrá que añadir privilegio para recargar postfix

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

configuración sudo (a través de visudo) permite NOPASSWD: para 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.

Otros consejos

#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 postfix restart. Por supuesto, puede restringir aún más el permiso de ejecución a determinados grupos.

Para responder el error: "sudo: lo siento, debe tener un TTY para ejecutar sudo", tenemos un ajuste llamado "predeterminados requiretty" en el archivo sudoers. He intentado comentar a cabo y ha funcionado:. D

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.

Si vas 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 "sudo" prefijo

StackLick

Es necesario conceder a un usuario ejecutar comando sudo sin contraseña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top