2009-02-24 9 views
16

Ho installato postfix sul mio computer e sto aggiornando al volo l'alias virtuale al volo (usando python) (su qualche azione). Una volta ho aggiornare la voce nel file/etc/postfix/virtual_alias, sto facendo funzionare il comando: Esegui un comando di sistema linux come superutente, usando uno script python

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
Ma sto ottenendo l'errore:
sudo: sorry, you must have a tty to run sudo

voglio eseguire il comando sudo citato in un modo non umano (significato, Sto eseguendo questo comando di sistema da uno script python.). Quindi, come faccio a far funzionare questo comando a livello di programmazione?

risposta

19

È possibile eseguire il proprio script python come root stesso, quindi non sarà necessario aggiungere privilegi per ricaricare postfix.

Oppure è possibile configurare sudo per non aver bisogno di una password per /etc/init.d/postfix.

configurazione sudo (tramite visudo) consente NOPASSWD: per consentire il comando senza password. Vedi http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

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

o qualcosa di simile.

+0

+1: esegui il sudo al di fuori dello script Python. –

+0

Douglas! Come posso configurare sudo per non aver bisogno di una password su quello script (/etc/init.d/postfix reload) da solo? –

+0

Fare sudo non è necessario che passwork sia soggetto a sudoers, e al di fuori della portata della domanda di programmazione, sudo può essere configurato per programma per utente. – myroslav

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

Questo ovviamente non è quasi sempre una buona idea in quanto la password è in chiaro.

+2

Una password sudo in chiaro è un'idea TERRIBILE, ci sono modi molto più sicuri. Il bit setuid risponde specificamente a questa preoccupazione. – codelogic

+0

Password di testo normale? Eeek! Imposta NOPASSWD in/etc/sudoers per l'utente o il gruppo, quindi non sarà necessario fornire alcuna password a sudo. –

+0

Non è una cattiva idea se si desidera una soluzione rapida e sporca sul proprio personal computer. È solo brutto in un ambiente di produzione. – 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"); 
} 

Completa il comando in un programma setuid. Ciò consentirà a qualsiasi utente di riavviare postfix. Ovviamente è possibile limitare ulteriormente il permesso di esecuzione a determinati gruppi.

+0

Stavo parlando di script Python! –

+0

Dato che stai apportando modifiche alla configurazione postfissa, ho pensato che fosse per un server e quella sicurezza sarebbe molto più importante dell'uso di un linguaggio di programmazione specifico. Non è possibile impostare gli script setuid() a causa del modo in cui vengono eseguiti, quindi questa soluzione (molto comune). – codelogic

+0

sudo è considerato un modo superiore per ottenere i privilegi di root. Cambia idea di dispersione di bit setuid su file system su singolo eseguibile capace di tale funzionalità (sudo) con configurazione centrale, politiche più flessibili con utilizzo abilitato alla verifica. – myroslav

3

Per rispondere all'errore: "sudo: mi dispiace, devi avere un tty per eseguire sudo", abbiamo un'impostazione chiamata "Defaults requiretty" nel file sudoers. Ho provato a commentare e ha funzionato: D.

+0

L'altro modo è di incollare un punto esclamativo davanti a requiretty, ad esempio "Predefinito! Requiretty". In questo modo chiunque legga il file sudoers può vedere che stai permettendo esplicitamente sudo senza un tty –

0

se hai intenzione di fare questo in Python si deve solo effettuare le seguenti operazioni:

scrittura questo comando prima della riga che si chiama il comando shell

os.setuid(os.geteuid()) 

allora, si chiama il comando shell senza prefisso "sudo"

Problemi correlati