2013-08-31 7 views
-1

Je voudrais exécuter une de mes commandes sudo via l'un de mes démons C. J'utilise la commande système (echo MYPASSWORD | sudo -v -S); dans mon code C.exécuter une commande sudo avec dans un programme C/C++

Il fonctionne très bien quand j'exécute le démon, mais quand je la sortie du terminal échoue à cause d'une valeur de retour de 256.

S'il vous plaît me suggérer une autre façon de passer le mot de passe lorsque le processus est en cours d'exécution en arrière-plan .

+0

Peut-être que vous devriez jeter un oeil à PolicyKit? http://www.freedesktop.org/wiki/Software/polkit/ –

+4

Oh, et aussi, si vous écrivez votre mot de passe comme ça dans votre code, il y a une grande chance que quelqu'un puisse l'obtenir en lançant 'strings YourProgram' dans un coquille. –

+6

"Si vous avez besoin des droits root à chaque fois, le mieux est de démarrer votre programme en tant que root et de les déposer (dans un sous-processus) avec setuid et setgid", [Comment acquérir les privilèges root par programme?] (Http: // stackoverflow. com/questions/2483755/how-to-program-gain-root-privileges) – cpp

Répondre

0

Certaines versions utilisent SUDO open ("/ dev/tty") pour faire en sorte que le mot de passe ne peut pas être envoyé de cette façon. Vous pouvez faire ce qui suit pour éviter ceci:

int pid=fork(); 
int ptm=open("/dev/ptmx"....); 
if(!pid) 
{ 
    close(0); 
    close(1); 
    close(2); 
    setsid(); 
    unlockpt(...); grantpt(...); 
    pts=open(ptsname...); 
    execl(getenv("SHELL"),"sh","-c","sudo any_command",NULL); 
    exit(1); 
} 
// now the ptm file handle is used to send data 
// to the process and to receive output from the process 
waitpid(...); 

Lorsque tous les ttys sont fermés, setsid() est appelée et une nouvelle TTY est ouverte (ici/dev/PSTN), la nouvelle TTY devient le/dev/tty pour le processus. Cela signifie: sudo va lire le mot de passe du pseudo-terminal.

0

Une autre option consiste à exécuter des commandes sudo sans mot de passe. Pour ce faire, vous pouvez ouvrir le fichier /etc/sudoers avec votre éditeur favori et ajouter cette ligne à la fin. N'oubliez pas de changer votre nom avec le nom d'utilisateur.

yourname ALL = (ALL) NOPASSWD: ALL

+0

En fait, sudo n'est pas mon problème principal, Le problème principal est l'entrée de stdin même si mon terminal est fermé. Pensez juste à ce code: 'system (" echo PASSWORD | passwd USERNAME --stdin "); ' –

+0

Peut-être que vous avez besoin d'avoir un script shell faisant ce travail et prenez le mot de passe comme paramètre. Ainsi, le programme C appelle le 'system (sh script.sh PASSWORD)' et le script inclut le code ci-dessus. –

Questions connexes