Le script présenté ci-dessus n'est toutefois pas suffisant. Dans ce
qui précède, sendfax demande un accès au
périphérique /dev/ttyS0 et au répertoire
/var/lock/ (pour créer un fichier de verrouillage
du modem, voir la section 35.4).
Ceci ne peut se faire en tant qu'utilisateur lp
(sous lequel le filtre que nous utilisons dans le script est exécuté).
Sur RedHat, la commande ls -ald /var/lock
/dev/ttyS0 montre que seul uucp est autorisé
à accéder au modem. Pour contourner cette restriction, nous devons
créer un binaire setgid (voir le chapitre 15)
qui s'exécute en tant qu'utilisateur uucp.
Réalisez cela en compilant le programme suivant:
#include <stdlib.h>
#include <string.h> #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { char **a; int i; /* set the real group ID to that of the effective group ID */ if (setdig (getegid ())) { perror (``sendfax_wrapper: setgid failed''); exit (1); } /* copy all arguments */ a = (char **) malloc ((argc + 1) * sizeof (char *)); for (i = 1; i < argc; i++) a[i] = (char *) strdup (argv [i]); a[argc] = NULL; /* execute sendfax */ a[0] = ``/usr/sbin/sendfax''; execvp (a[0], a); /* exit on failure */ perror (``sendfax_wrapper: failed to execute /usr/sbin/sendfax''); exit (1); } |
gcc sendfax_wrapper.c -o /usr/sbin/sendfax_wrapper
-Wall
chown lp:uucp /usr/sbin/sendfax_wrapper chmod g+s,o-rwx /usr/sbin/sendfax_wrapper |
Sur votre propre système, il peut s'avérer plus judicieux d'essayer de mettre en oeuvre ce qui vient d'être décrit sans une interface (wrapper). Debian, par exemple, a un groupe dialout pour autoriser les accès aux modems. Soyez également conscient que certaines distributions n'utilisent pas forcément uucp de la même manière que RedHat. Vous devrez peut-être créer un utilisateur adéquat pour atteindre votre objectif.