CUESTIÓN


Ejecuto la práctica en Linux y aparece el siguiente error:
~$ cambia pepe.txt
./cambia:chmod:pepe.txt: Operation not permitted

SOLUCIÓN

Sigamos, un poco, el esquema que se siguió en un caso parecido. Buscamos, a continuación, en la página de manual de chown a qué se corresponde el error que nos aparece:
~$ man lchown
CHOWN(2)                                   Linux Programmer's Manual                                  CHOWN(2)

NAME
       chown, fchown, lchown - change ownership of a file

SYNOPSIS
       #include <unistd.h>

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

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
[...]
ERRORS
       Depending on the file system, other errors can be returned.  The more general errors  for  chown()  are
       listed below.
[...]
       EPERM  The  calling  process  did  not have the required permissions (see above) to change owner and/or
              group.
Hemos elegido el error EPERM porque es el que más se parece al error que nos ha dado perror (Operation not permitted). Traducimos:

Dependiendo del sistema de ficheros, pueden devolverse otros errores. Los errores más habituales de chown() se listan más abajo.
(EPERM) El proceso no tenía los permisos requeridos (véase arriba) para cambiar el propietario y/o el grupo.


Miramos arriba y pone:
      The  owner  of a file may change the group of the file to any group of which that owner is a member.  A
       privileged process (Linux: with CAP_CHOWN) may change the group arbitrarily.
O, lo que es igual: El propietario de un fichero puede cambiar el grupo del fichero a cualquier grupo del que el propietario sea miembro. Un proceso con privilegios (Linux: con CAP_CHOWN) puede cambiar grupos a voluntad.

Está claro que este párrafo de la página de manual está inspirado en la escena del contrato de Una noche en la Ópera de los Hermanos Marx.

Pero, volvamos a nuestro caso. Se trata, como en el caso que se apuntaba arriba, de un mecanismo de seguridad. ¿Cómo sabemos a qué grupos pertenece nuestro usuario? Esos grupos son a los que podemos cambiar nuestros ficheros. La orden en UNIX es groups:
~$ groups
alumno adm dialout cdrom floppy audio dip video plugdev fuse lpadmin admin
Aunque, esto nos sirve más bien de poco, pues la llamada al sistema nos pide un número. Y es que todos los grupos tienen asociado un identificador de grupo en el sistema. El fichero donde viene esa información es /etc/group. Localicemos, por ejemplo, el número que corresponde al grupo dialout en nuestro sistema. Lo podemos hacer editando el fichero o, si somos diestros en la shell, hacer que la localice el ordenador por nosotros:
~$ grep dialout /etc/group
dialout:x:20:alumno
El 20 que aparece es el identificador del grupo dialout en este sistema. Basta con que pongamos ese 20 en lugar del 666 para que el programa funcione.


© 2011 Guillermo González Talaván.