Solución:
Algunos sistemas admiten cambiar el permiso de un enlace simbólico, otros no.
- chmod: cambia los modos de archivo o las listas de control de acceso (OSX y FreeBSD,
-h
)
-h
Si el archivo es un enlace simbólico, cambie el modo del enlace en sí en lugar del archivo al que apunta el enlace. - chmod – cambiar los bits del modo de archivo (Linux)
chmod
nunca cambia los permisos de los enlaces simbólicos; la llamada al sistema chmod no puede cambiar sus permisos. Esto no es un problema ya que los permisos de los enlaces simbólicos nunca se utilizan. Sin embargo, para cada enlace simbólico listado en la línea de comando, chmod cambia los permisos del archivo apuntado. Por el contrario, chmod ignora los enlaces simbólicos encontrados durante recorridos de directorio recursivos.
Dado que la característica es diferente, POSIX no menciona la posibilidad.
A partir de los comentarios, alguien sugiere que un cambio reciente a GNU coreutils proporciona la -h
opción. Por el momento, eso no aparece en el código fuente de chmod:
while ((c = getopt_long (argc, argv, ("Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::" "0::1::2::3::4::5::6::7::"), long_options, NULL))
y long_options
tiene esto:
static struct option const long_options[] =
{
{"changes", no_argument, NULL, 'c'},
{"recursive", no_argument, NULL, 'R'},
{"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
{"preserve-root", no_argument, NULL, PRESERVE_ROOT},
{"quiet", no_argument, NULL, 'f'},
{"reference", required_argument, NULL, REFERENCE_FILE_OPTION},
{"silent", no_argument, NULL, 'f'},
{"verbose", no_argument, NULL, 'v'},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{NULL, 0, NULL, 0}
};
Los permisos se establecen con chmod
. La propiedad se establece con chown
. GNU coreutils (como BSD) admite la capacidad de cambiar la propiedad de un enlace simbólico. Esta es una característica diferente, ya que la propiedad de un enlace simbólico está relacionada con si uno puede modificar el contenido del enlace (y apuntarlo a un destino diferente). Nuevamente, esto comenzó como una función BSD (OSX, FreeBSD, etc.), que también es compatible con Linux (y Solaris, etc.). POSIX dice de esta característica:
-h
Para cada operando de archivo que nombra un archivo de tipo enlace simbólico, chown intentará establecer el ID de usuario del enlace simbólico. Si se especificó un ID de grupo, para cada operando de archivo que nombre un archivo de tipo enlace simbólico, chown intentará establecer el ID de grupo del enlace simbólico.
Hasta aquí las herramientas de la línea de comandos (y los scripts de shell). Sin embargo, podrías escribir su propia utilidad, utilizando una función de POSIX que no se menciona en la discusión de la chmod
utilidad:
int chmod(const char *path, mode_t mode);
int fchmodat(int fd, const char *path, mode_t mode, int flag);
La última función agrega un bandera parámetro, que se describe así:
Valores para bandera están construidos por un OR inclusivo bit a bit de banderas de la siguiente lista, definida en
<fcntl.h>
:
AT_SYMLINK_NOFOLLOW
Si sendero nombra un enlace simbólico, luego se cambia el modo del enlace simbólico.
Es decir, el propsito de fchmodat
es proporcionar la función sobre la que solicitó. Pero la línea de comandos chmod
La utilidad está documentada (hasta ahora) solo en términos de chmod
(sin esta función).
fchmodat
, por cierto, parece haber comenzado como una característica pobremente documentada de Solaris que fue adoptada por los desarrolladores de Red Hat y GNU hace diez años, y sugerida por ellos para la estandarización:
- se requiere una función más de estilo openat: fchmodat
- Austin Group Acta de la teleconferencia del 17 de mayo de 2007
- [Fwd: The Austin Group announces Revision Draft 2 now available]
De acuerdo a La interfaz de programación de Linux, desde 2.6.16, Linux admite AT_SYMLINK_NOFOLLOW
en estas convocatorias: faccessat
, fchownat
, fstatat
, utimensat
, y linkat
se implementó en 2.6.18 (ambos bastante “antiguos”: 2006, según OSNews).
Si la función le resulta útil o no, depende de los sistemas que utilice.
No se evalúa el permiso para enlaces simbólicos.
En épocas anteriores, no había forma de cambiar los bits de permiso para los enlaces simbólicos.
Desde hace un tiempo, POSIX introdujo fchmodat()
y todas las plataformas que admiten esta llamada pueden cambiar los bits de permiso de los enlaces simbólicos.
Sin embargo, no espere que esto tenga efectos en el enlace simbólico.