Que modo de arquivo é um link simbólico?

5

Qual modo de arquivo indica que um arquivo é um link simbólico (link simbólico)?

Meu caso de uso é para detectar links simbólicos dentro de um repositório git (e seu histórico). Fiquei com a impressão de que um link simbólico é um link simbólico devido ao seu modo de arquivo, e esse modo de arquivo é o que a ferramenta chmod define.

    
por ThorSummoner 30.03.2015 / 23:12

3 respostas

5

Os modos de arquivo cobrem duas noções diferentes: tipos de arquivo e permissões de arquivo. O modo de um arquivo é representado pelo valor de st_mode no resultado de stat(2) chamadas e ls -l apresenta todas elas juntas; consulte Noções básicas sobre permissões e tipos de arquivo UNIX para obter detalhes.

Quando um arquivo é criado, seu tipo não pode ser alterado. Além disso, nos sistemas Linux, você não pode especificar as permissões de um link simbólico; tudo o que importa é a permissão do alvo (e efetivamente o modo completo, já que isso também determina o comportamento do symlink). Veja link para detalhes. Em links simbólicos do Mac OS X podem ter suas próprias permissões.

Por fim, git usa um modelo simplificado, com um número limitado de modos reconhecidos:

  • 040000 para um diretório
  • 100644 para um arquivo normal
  • 100755 para um arquivo executável
  • 120000 para um link simbólico

Você pode ver esses valores usando comandos como git cat-file -p 'master^{tree}' ; veja Pro Git para detalhes.

    
por 30.03.2015 / 23:30
1

What file mode indicates that a file is a symbolic link (symlink)?

A API POSIX para verificar se um arquivo é um link simbólico está usando a macro S_ISLNK .

Na glibc, S_ISLNK é definido da seguinte forma:

#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)

i.e. um arquivo é um link simbólico if ((mode & 0170000) == 0120000) (pelo menos no GNU / Linux).

    
por 08.02.2018 / 11:50
-1

Um link simbólico (embora alguns sistemas de arquivos lidem com links simbólicos de maneira diferente) é uma entrada da tabela inode que aponta para o mesmo local que outro arquivo (ou diretório).

Por exemplo, se foo for inode 1234 , então bar (um link simbólico para foo) será inode 1234 .

bar realmente não existe, é apenas um ponteiro para um arquivo "real".

Symlinks geralmente não tem permissões fora das permissões do arquivo para o qual elas apontam. Por isso, bar's permissões são "iguais" as foo's . Você não pode definir permissões em bar (o link simbólico) apenas em foo (o arquivo real).

Dito isto, é uma visão de alto nível. Diferentes sistemas de arquivos lidam com links simbólicos de maneira diferente. Diferentes ferramentas manipulam symlinks de maneira diferente. Alguns sistemas de arquivos "sinalizam" symlinks e lidam com eles especialmente, mas outros não.

Por exemplo, chmod on Linux não altera as permissões symlinks , mas OSX você pode obtê-lo. Em ambos os casos, as permissões dos arquivos reais são alteradas.

Eu não consigo pensar em nenhum sistema (não significa que não esteja lá), onde symlink tem permissões separadas do arquivo real.

    
por 30.03.2015 / 23:25

Tags