¿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

  • Consulte superuser.com/questions/303040/…
  • Parece que es mejor que se haya formulado mi pregunta ‘ qué modo de archivo son los enlaces simbólicos en git ‘.
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • 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.
  • @JohnWHSmith ¡Estaría ansioso por votar a favor de un enlace a documentos que distingan las diferencias de modos de archivo y tipos de archivo! : D

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *