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.