¿Qué modo de archivo indica que un archivo es un enlace simbólico (enlace simbólico)?
Mi caso de uso es detectar simbólicos enlaces dentro de un repositorio de git (y su historial). Tenía la impresión de que un enlace simbólico es un enlace simbólico debido a su modo de archivo, y ese modo de archivo es lo que establece la herramienta chmod
.
Comentarios
Respuesta
Los modos de archivo cubren dos nociones diferentes: tipos de archivo y permisos de archivo. El modo de un archivo está representado por el valor de st_mode
en el resultado de stat(2)
llamadas y ls -l
los presenta todos juntos; consulte Comprender los permisos de UNIX y los tipos de archivo para obtener más detalles.
Una vez que se crea un archivo, su tipo puede «No ser cambiado. Además, en los sistemas Linux no puede «especificar los permisos de un enlace simbólico»; todo lo que importa es el permiso del objetivo (y efectivamente el modo completo, ya que eso también determina el comportamiento del enlace simbólico). Consulte ¿Cómo se aplican los permisos de archivo a los enlaces simbólicos? para obtener más detalles. En Mac OS X, los enlaces simbólicos pueden tener sus propios permisos.
Finalmente, git
usa un modelo simplificado, con un número limitado de modos reconocidos:
-
040000
para un directorio -
100644
para un archivo normal -
100755
para un archivo ejecutable -
120000
para un enlace simbólico
Puede ver estos valores usando comandos como git cat-file -p "master^{tree}"
; consulte Pro Git para obtener más detalles.
Respuesta
¿Qué modo de archivo indica que un archivo es un enlace simbólico (enlace simbólico)?
La API POSIX para comprobar si un archivo es un enlace simbólico, se utiliza la macro S_ISLNK
.
En glibc, S_ISLNK
se define de la siguiente manera:
#define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
es decir un archivo es un enlace simbólico if ((mode & 0170000) == 0120000)
(al menos en GNU / Linux).
Respuesta
Un enlace simbólico (aunque algunos sistemas de archivos manejan los enlaces simbólicos de manera diferente) es una entrada de tabla inode
que apunta al mismo lugar que otro archivo (o directorio).
Por ejemplo, si foo
es inode 1234
entonces bar
(un enlace simbólico a foo) es inode 1234
.
bar
no existe realmente, es solo un puntero a un archivo «real».
Symlinks
generalmente no tiene permisos fuera de los permisos del archivo al que apuntan. Por lo tanto, bar"s
los permisos son «el mismo» as foo"s
. No puede «establecer permisos en bar
(el enlace simbólico) solo en foo
(el archivo real).
Dicho esto, es una vista de muy alto nivel. Los diferentes sistemas de archivos manejan los enlaces simbólicos de manera diferente. Las diferentes herramientas manejan symlinks
de manera diferente. Algunos sistemas de archivos «marcan» symlinks
y manejarlos especialmente, pero algunos no lo hacen.
Por ejemplo, chmod
en Linux
no «no cambiará un symlinks
permisos, pero en OSX
puedes acceder. En ambos casos, los permisos de archivos reales se cambian.
No puedo pensar en ningún sistema (no «t significa que «no está ahí afuera) donde un symlink
tiene permisos separados del archivo real.
Comentarios
- No, un enlace simbólico es un tipo de archivo (» todo es un archivo «) que contiene un nombre de archivo en lugar de general- datos de propósito. Por lo general, este nombre de archivo se refiere a un archivo existente, que ‘ es el objetivo de tener enlaces simbólicos, pero no se garantiza que sea cierto. Sí, un enlace simbólico (como cualquier otro tipo de archivo) tiene un inodo. No, un enlace simbólico y el archivo al que apunta tiene inodos separados, con diferentes números de inodo. Los enlaces Hard tienen el mismo inodo, y por lo tanto el mismo número de inodo ber.
- bueno, estaba destinado a ser de alto nivel, pero los sistemas modernos no ‘ no crean un archivo en el disco duro, la tabla de inodo contiene la cadena y no se almacena ningún archivo real. creado. Creo que ‘ se llama » enlace simbólico rápido »
- Si ‘ foo ‘ y ‘ bar ‘ son ambos punteros al nodo 1234, luego ‘ son enlaces HARD, no enlaces simbólicos. Si » bar » fuera un SYMlink, entonces sería literalmente la cadena de caracteres » foo » (o incluso la ruta a foo) en lugar de un nodo. De hecho, puede crear un enlace simbólico que no ‘ apunte a ningún lugar significativo, p. Ej.
ln -s 'this is not a real file' bar
- Además: BSD (que incluye Mac OS X) tiene una llamada al sistema lchmod () que le permitirá establecer los permisos del enlace simbólico en sí. No tengo idea de cuál es el uso de eso.
chmod
establece los bits de permiso (rwx y sticky / setuid / setgid bits, …): esto es lo que llamamos un » modo «. Pero parece que se está refiriendo a tipos de archivos en su lugar.