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
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.
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.