CUESTIÓN


He hecho la práctica de la sesión, la he repasado mil veces, pero resulta que cuando la ejecuto me da el error:
<ENCINA>/home/gyermo$ cambia pepe
lchown:pepe: Not owner


SOLUCIÓN

Primero comprobamos si el fallo es de nuestro programa o es que el sistema está configurado así. Para ello, usamos la orden del sistema operativo que se usa para cambiar de grupo a un fichero: chgrp
<ENCINA>/home/gyermo$ ls -l dirent.txt
-rw-r--r--   1 gyermo   profes      1688 feb 19 20:11 dirent.txt
<ENCINA>/home/gyermo$ chgrp 666 dirent.txt
chgrp: dirent.txt: Not owner
Todas las órdenes del sistema operativo, incluída chgrp, no son más que programas en C parecidos al programa cambia, pero escritos por los autores del sistema operativo. Vemos que chgrp produce el mismo error que nuestro programa, por lo que nos tememos que el problema no es que el programa que hemos hecho esté mal.

Localicemos lo que nos dice la página de manual de lchown acerca de ese error:
<ENCINA>/home/gyermo$ man lchown
Reformatting page.  Please Wait... done

System Calls                                             chown(2)

NAME
     chown, lchown, fchown - change owner and group of a file

SYNOPSIS
     #include <unistd.h>
     #include <sys/types.h>

     int chown(const char *path, uid_t owner, gid_t group);

     int lchown(const char *path, uid_t owner, gid_t group);

     int fchown(int fildes, uid_t owner, gid_t group);

DESCRIPTION
     The chown() function sets the owner ID and group ID  of  the
     file  specified  by  path  or  referenced  by  the open file
[...]
ERRORS
     The chown() and lchown() functions will fail if:

[...]
     EPERM The effective user ID does not match the owner of  the
           file   or  the  process  is  not  the  super-user  and
           _POSIX_CHOWN_RESTRICTED indicates that such  privilege
           is required.
O, traducido al román paladino:

Las funciones chown() y lchown() fallarán si:
(EPERM) La ID del usuario efectivo no coincide con el propietario del fichero o el proceso no es (del) superusuario y _POSIX_CHOWN_RESTRICTED indica que se requiere tal privilegio.


Como el fichero al que intentamos cambiar el permiso sí es nuestro, si se produce el error es porque está activa la opción del sistema _POSIX_CHOWN_RESTRICTED y en efecto no somos el superusuario.

Este es un mecanismo de seguridad adicional que viene en UNIXes nuevos. No se permite cambiar el grupo de un fichero a no ser que se sea el superusuario.
© 2002 Guillermo González Talaván.