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


Meu caso de uso é detectar simbólico links dentro de um repositório git (e seu histórico). Tive a impressão de que um link simbólico é um link simbólico por causa de seu modo de arquivo, e esse modo de arquivo é o que a ferramenta chmod define.

Comentários

  • Veja superuser.com/questions/303040/…
  • Parece que minha pergunta pode ter sido melhor perguntada ‘ quais modos de arquivo são links simbólicos em git ‘.
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • chmod define bits de permissão (bits rwx e sticky / setuid / setgid, …): isso é o que chamamos de modo ” “. Mas você parece estar se referindo a tipos de arquivo.
  • @JohnWHSmith Eu gostaria muito de votar a favor de um link para documentos que distinguem as diferenças de modos e tipos de arquivos! : D

Resposta

Os modos de arquivo abrangem duas noções diferentes: tipos de arquivo e permissões de arquivo. O modo “s de um arquivo é representado pelo valor de st_mode no resultado de stat(2) chamadas e ls -l apresenta todos eles juntos; consulte Compreendendo as permissões e tipos de arquivo do UNIX para obter detalhes.

Depois que um arquivo é criado, seu tipo pode “t ser alterado. Além disso, em 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 determina o comportamento do link simbólico também). Consulte Como as permissões de arquivo se aplicam aos links simbólicos? para obter detalhes. No Mac OS X, os links simbólicos podem ter suas próprias permissões.

Finalmente, 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}"; consulte Pro Git para obter detalhes.

Resposta

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

A API POSIX a ser verificada se um arquivo for um link simbólico está usando a macro S_ISLNK.

No glibc, S_ISLNK é definido da seguinte maneira:

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

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

Resposta

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

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

bar não existe realmente, é apenas um indicador para um arquivo “real”.

Symlinks geralmente não tem permissões fora das permissões do arquivo para o qual eles apontam. Portanto, as permissões de bar"s são “o mesmo” as foo"s. Você não pode “definir permissões em bar (o link simbólico) apenas em foo (o arquivo real).

Dito isso, é “uma visão realmente de alto nível. Sistemas de arquivos diferentes lidam com links simbólicos de maneira diferente. Ferramentas diferentes lidam com symlinks de maneira diferente. Alguns sistemas de arquivos” flag ” div id = “21a5bf944f”>

e lidar com eles especialmente, mas alguns não.

Por exemplo chmod em Linux não “mudará um symlinks permissões, mas em OSX você pode obtê-lo. Em ambos os casos, as permissões de arquivos reais são alteradas.

Não consigo pensar em nenhum sistema (não significa que “não está por aí), onde um symlink tem permissões separadas do arquivo real.

Comentários

  • Não, um link simbólico é um tipo de arquivo (” tudo é um arquivo “) que contém um nome de arquivo em vez de um general- dados de propósito. Normalmente, este nome de arquivo refere-se a um arquivo existente – que ‘ é o ponto principal de ter links simbólicos – mas não é garantido que seja verdade. Sim, um link simbólico (como qualquer outro tipo de arquivo) tem um inode. Não, um link simbólico e o arquivo que ele aponta têm inodes separados, com diferentes números de inode. Links Hard têm o mesmo inode, e assim o mesmo inode num ber.
  • bem, era para ser de alto nível, mas os sistemas modernos não ‘ t fazem um arquivo no disco rígido a tabela de inode contém a string e nenhum arquivo real é criado. Acho que ‘ é chamado de ” link simbólico rápido ”
  • Se ‘ foo ‘ e ‘ bar ‘ são ambos indicadores para o nó 1234, então eles ‘ são links HARD, não links simbólicos. Se ” bar ” fosse um link SYM, seria literalmente a sequência de caracteres ” foo ” (ou mesmo o caminho para foo) em vez de um nó. Na verdade, você pode criar um link simbólico que ‘ não aponte para qualquer lugar significativo, por exemplo, ln -s 'this is not a real file' bar
  • Além disso: BSD (que inclui Mac OS X) tem uma chamada de sistema lchmod () que permitirá que você defina as permissões do próprio link simbólico. Não tenho ideia de para que serve isso.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *