Noções básicas sobre permissões UNIX e tipos de arquivo


68

Eu realmente nunca entendi como chmodfuncionou até hoje. Eu segui um tutorial que me explicou muito.

Por exemplo, eu li que você tem três grupos de permissão diferentes:

  • proprietário ( u)
  • group ( g)
  • todos ( o)

Com base nesses três grupos, agora sei que:

  • Se o arquivo pertencer ao usuário, as permissões do usuário determinarão o acesso.
  • Se o grupo do arquivo for o mesmo que o grupo do usuário, a permissão do grupo determinará o acesso.
  • Se o usuário não for o proprietário do arquivo e não estiver no grupo, a outra permissão será usada.

Também aprendi que você tem as seguintes permissões:

  • read ( r)
  • write ( w)
  • execute ( x)

Criei um diretório para testar meus conhecimentos recém-adquiridos:

mkdir test

Então eu fiz alguns testes:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Depois de brincar por um tempo, acho que finalmente entendi chmode como você define a permissão usando esse comando.


Mas...

Ainda tenho algumas perguntas:

  • O que significa dno início?
  • Qual é o nome e o uso do slot que contém e que outros valores ele pode conter?
  • Como posso definir e desabilitar?
  • Qual o valor disso d? (Como você tem apenas 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Por que as pessoas às vezes usam em 0777vez de 777definir suas permissões?

Mas como eu não deveria estar fazendo várias perguntas, tentarei fazê-lo em uma pergunta.

No sistema baseado em UNIX, como todas as distribuições Linux, referente às permissões, o que a primeira parte ( d) representa e para que serve essa parte das permissões?


3
Na próxima vez em que tentar fazer apenas uma pergunta, as perguntas múltiplas geralmente são ruins para referência e quase nunca são abordadas ao mesmo tempo.
Kiwy

11
@ Kiwy Me desculpe, eu pensei que faria assim porque se refere ao mesmo assunto. Se você quiser, pode sugerir um título melhor para minha pergunta, para melhorar sua referência.
Peter

11
Aliás, o valor para o "d" é 040000 - ele pode ser encontrado nos arquivos de cabeçalho sob o nome S_IFDIR. Você não o usa ao definir o modo de arquivo, mas a stat()função realmente retorna o valor 040750 para drwxr-x---.
Random832

2
@jamesqf Na verdade, agora que entendo como os códigos octais mapeiam, é mais simples para mim pensar dessa maneira.
HalosGhost

4
@ Peter: não há perguntas estúpidas - apenas estupidas que não aprendem porque têm medo de perguntar.
Mgarciaisaia

Respostas:


117

Responderei suas perguntas em três partes: tipos de arquivo, permissões e casos de uso para as várias formas de chmod.

Tipos de arquivo

O primeiro caractere na ls -lsaída representa o tipo de arquivo; dsignifica que é um diretório. Não pode ser definido ou desabilitado, depende de como o arquivo foi criado. Você pode encontrar a lista completa dos tipos de arquivos na documentação ls ; aqueles que você provavelmente encontrará

  • -: Arquivo "regular", criado com qualquer programa que possa gravar um arquivo
  • b: bloco de arquivo especial, normalmente dispositivos de disco ou partição, pode ser criado com mknod
  • c: arquivo especial de caractere, também pode ser criado com mknod(veja /devexemplos)
  • d: diretório, pode ser criado com mkdir
  • l: link simbólico, pode ser criado com ln -s
  • p: pipe nomeado, pode ser criado com mkfifo
  • s: socket, pode ser criado com nc -U
  • D: door , criado por alguns processos do servidor no Solaris / openindiana.

Permissões

chmod 0777é usado para definir todas as permissões em uma chmodexecução, em vez de combinar alterações com u+etc. Cada um dos quatro dígitos é um valor octal que representa um conjunto de permissões:

  • suid, sgidE “pegajosa” (veja abaixo)
  • permissões de usuário
  • permissões de grupo
  • Permissões "outros"

O valor octal é calculado como a soma das permissões:

  • "Ler" é 4
  • "Escrever" é 2
  • "Executar" é 1

Para o primeiro dígito:

  • suidé 4; binários com esse conjunto de bits são executados como usuário proprietário (geralmente root)
  • sgidé 2; os binários com esse conjunto de bits são executados como seu grupo proprietário (usado para jogos para que pontuações mais altas possam ser compartilhadas, mas geralmente é um risco de segurança quando combinado com vulnerabilidades nos jogos), e os arquivos criados nos diretórios com esse conjunto de bits pertencem ao grupo de proprietários do diretório por padrão (útil para criar pastas compartilhadas)
  • "Pegajoso" (ou "exclusão restrita") é 1; os arquivos nos diretórios com esse conjunto de bits podem ser excluídos apenas pelo proprietário, pelo proprietário do diretório ou root(veja /tmpum exemplo comum disso).

Veja a página de chmodmanual para detalhes. Observe que, em tudo isso, estou ignorando outros recursos de segurança que podem alterar as permissões dos usuários nos arquivos (SELinux, arquivo ACLs ...).

Os bits especiais são tratados de maneira diferente, dependendo do tipo de arquivo (arquivo ou diretório comum) e do sistema subjacente. (Isso é mencionado na página de chmodmanual.) No sistema que eu costumava testar isso (com coreutils8.23 em um ext4sistema de arquivos, executando o kernel do Linux 3.16.7-ckt2), o comportamento é o seguinte. Para um arquivo, os bits especiais são sempre limpos, a menos que definido explicitamente, portanto, chmod 0777é equivalente a chmod 777, e ambos os comandos limpam os bits especiais e concedem a todos permissões totais no arquivo. Para um diretório, os bits especiais nunca são totalmente limpos usando a forma numérica de quatro dígitos; portanto, chmod 0777também é equivalente achmod 777mas é enganador, pois alguns dos bits especiais permanecerão como estão. (A versão anterior desta resposta coisa está errada.) Para limpar pedaços especiais em diretórios que você precisa usar u-s, g-se / ou o-texplicitamente ou especificar um valor numérico negativo, então chmod -7000irá limpar todos os bits especiais em um diretório.

Na ls -lsaída, suid, sgide “pegajosa” aparecer no lugar da xentrada: suidé sou Sem vez do usuário do x, sgidé sou Snão ao grupo de x, e “pegajoso” é tou Tem vez dos outros x. Uma letra minúscula indica que o bit especial e o executável estão definidos; uma letra maiúscula indica que apenas o bit especial está definido.

As várias formas de chmod

Por causa do comportamento descrito acima, usar os quatro dígitos completos chmodpode ser confuso (pelo menos parece que eu estava confuso). É útil quando você deseja definir bits especiais e bits de permissão; caso contrário, os bits serão limpos se você estiver manipulando um arquivo, preservados se você estiver manipulando um diretório. Assim, chmod 2750você garante pelo menos sgide exatamente u=rwx,g=rx,o=; mas chmod 0750não necessariamente limpará os bits especiais.

Usar modos numéricos em vez de comandos de texto ( [ugo][=+-][rwxXst]) é provavelmente mais um caso de hábito e o objetivo do comando. Quando você está acostumado a usar os modos numéricos, geralmente é mais fácil especificar o modo completo dessa maneira; e é útil poder pensar em permissões usando modos numéricos, pois muitos outros comandos podem usá-las ( install, mknod...).

Algumas variantes de texto podem ser úteis: se você simplesmente deseja garantir que um arquivo possa ser executado por qualquer pessoa, chmod a+xfará isso, independentemente de quais sejam as outras permissões. Da mesma forma, +Xadiciona a permissão de execução apenas se uma das permissões de execução já estiver definida ou se o arquivo for um diretório; isso pode ser útil para restaurar permissões globalmente sem a necessidade de arquivos de casos especiais v. diretórios. Portanto, chmod -R ug=rX,u+w,o=é equivalente a aplicar chmod -R 750a todos os diretórios e arquivos executáveis ​​e chmod -R 640a todos os outros arquivos.


Porém, as outras respostas foram muito boas, você realmente passou algum tempo respondendo a essa pergunta. Obrigado.
Peter

No * BSD, os diretórios se comportam como se seu sgidbit estivesse sempre definido, independentemente do seu valor real. No FreeBSD, o suidbit pode ser configurado para agir de maneira análoga a sgid(ou seja, arquivos e subdiretórios criados dentro terão o mesmo proprietário do diretório), desde que o sistema de arquivos subjacente suporte isso e seja montado com a suiddiropção
Lcd047

" +Xadiciona a permissão de execução apenas se uma das permissões de execução já estiver definida ou o arquivo for um diretório" obrigado @ stephen-kitt, faltando a documentação "já está definida" realmente estava me provocando!
Ryan Fisher

39

Portanto, as permissões no Linux são muito importantes. Vou tentar fazer uma breve explicação.

Para partes de um modo de arquivo

Todo arquivo Unix possui um conjunto de permissões que determinam se você pode ler, gravar ou executar o arquivo. A execução de ls -l exibe as permissões. Aqui está um exemplo dessa exibição:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Anexo uma imagem de partes de um modo de arquivo:

insira a descrição da imagem aqui

Tipo pode ser coisa diferente. Por exemplo:

  • d (diretório)
  • c (dispositivo de caractere)
  • l (link simbólico)
  • p (pipe nomeado)
  • s (soquete)
  • b (dispositivo de bloco)
  • D (porta, não é comum em sistemas Linux, mas foi portada)

Se você deseja definir algumas permissões para todos os diretórios, pode usar o atributo R, por exemplo:

chmod -R 777 /some/directory/

Para chmod 777 vs 0777

O chmodcomando normalmente espera que a entrada seja um número octal, o zero inicial refere-se ao valor do trigêmeo de bit pegajoso / sgid / suid. No entanto, em C, isso faria diferença, pois 777seria traduzido para 01411(octal), configurando o bit adesivo (consulte a chmod(2)página do manual), permissões de leitura para o proprietário e bit executável para o grupo e outros (o que é uma combinação bastante estranha) .

EDIT 1

Encontrei outra foto sobre as permissões do Linux e anexarei para entender mais fácil: Permissões de arquivo UNIX


5
Você está errado sobre o 777 vs 0777. Ambos são octais (decimais não fazem sentido, de qualquer maneira, neste caso), mas, na forma de quatro caracteres, o primeiro dígito define os bits especiais (fixos e definidos).
orion

3
@orion Ocasionalmente, na verdade, é verdade, por exemplo, em um código do tipo C chmod(777)seria o equivalente à execução chmod 1411(ou seja, o chmodcomando com argumento 1411).
Peterph

2
... que no caso do syscall (ou de seu invólucro) e do binário com o mesmo nome pode ser um pouco confuso.
Peterph

3
Python Race Master resolvido este problema para trás, proibindo todos os "números" que começam com 0, forçando o usuário a ser explícito se eles querem outra coisa senão decimal, por exemplo hex: 0x1FF, binária: 0b111111111ou octal: 0o777. PYTHON POWER
Nick T

Fonte da imagem?
rugk

10

dsignifica que é um diretório, se você possui um arquivo -e se é um link, encontrará um l. Não pode ser definido / desabilitado.

Se você usar 0777 como permissões, estará dando controle total (leitura + gravação + execução) a todos os usuários / grupos do sistema. É uma maneira lenta de resolver problemas quando você tem usuários / grupos que não conseguem acessar diretórios / arquivos.

Por exemplo, se você listar o conteúdo de um diretório e obter o seguinte:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so é um arquivo de propriedade da raiz do usuário e da raiz do grupo. O proprietário tem acesso de leitura e gravação, o grupo tem apenas acesso de leitura e qualquer outro usuário tem acesso de leitura. Isso pode ser traduzido como 644.

Se eu mudar para 777, ficará assim:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


7

Depois de obter minha pergunta respondida aqui e fazer algumas pesquisas sobre o resultado, encontrei um artigo que explica tudo muito bem. Gostaria de compartilhar algumas partes deste artigo aqui para futuras referências.

Permissões de visualização

Para chmodalterar as permissões de um arquivo ou diretório, primeiro você precisa saber qual é o modo de acesso atual. Você pode visualizar o conteúdo de um diretório no terminal por cdesse diretório e, em seguida, usar:

$ ls -l

A -lopção é importante porque o uso lssem ela exibirá apenas os nomes de arquivos ou pastas no diretório.

Abaixo está um exemplo de uso ls -lno meu diretório pessoal:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

O que as colunas significam

A primeira coluna é o tipo de cada arquivo:

  • - indica um arquivo normal.
  • d indica um diretório, ou seja, uma pasta que contém outros arquivos ou pastas.
  • p denota um pipe nomeado (aka FIFO).
  • l indica um link simbólico.

As letras a seguir são as permissões. Nesta primeira coluna, estaremos mais interessados. A segunda é em quantos links existem em um arquivo, podemos ignorá-lo com segurança. A terceira coluna possui dois valores / nomes: O primeiro (no meu exemplo 'peter') é o nome do usuário que possui o arquivo. O segundo valor ('usuários' no exemplo) é o grupo ao qual o proprietário pertence (Leia mais sobre grupos).

A próxima coluna é o tamanho do arquivo ou diretório em bytes e as informações são as datas e horas em que o arquivo ou diretório foi modificado pela última vez e, é claro, o nome do arquivo ou diretório.

O que as permissões significam

As três primeiras letras, após a primeira -ou d, são as permissões que o proprietário possui. As próximas três letras são permissões que se aplicam ao grupo. As três letras finais são as permissões que se aplicam a todos os outros.

Cada conjunto de três letras é composto por r we x. restá sempre na primeira posição, westá sempre na segunda posição e xestá sempre na terceira posição. ré a permissão de leitura, wé a permissão de gravação e xé a permissão de execução. Se houver um hífen ( -) no lugar de uma dessas cartas, significa que a permissão não é concedida e, se a carta estiver presente, será concedida.

Pastas

No caso de pastas, os bits de modo podem ser interpretados da seguinte maneira:

  • r (read) significa a capacidade de ler o índice do diretório especificado,
  • w(write) significa a capacidade de escrever o índice do diretório especificado (criar novos arquivos, pastas; renomear, excluir arquivos, pastas existentes) se e somente se o bit de execução estiver definido. Caso contrário, essa permissão não terá sentido.
  • x (execute) significa a capacidade de entrar no diretório especificado com o comando cd e acessar arquivos, pastas nesse diretório.

Alterando permissões usando o comando chmod

chmodé um comando no Linux e outros sistemas operacionais semelhantes ao Unix. Permite alterar as permissões (ou modo de acesso) de um arquivo ou diretório.

Você pode alterar as permissões de duas maneiras diferentes: - Com base em texto - Com base em chmod númerochmod

Método de texto

Para alterar as permissões ou o modo de acesso de um arquivo, usamos o comando chmod em um terminal. Abaixo está a estrutura geral do comando:

chmod who=permissions filename

Onde Quem é do grupo de letras e cada um significa para quem você vai dar permissão. Eles são os seguintes:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

As permissões são as mesmas que já discutida ( r, w, e x).

O comando chmod permite adicionar e subtrair permissões de um conjunto existente usando + ou - em vez de =. Isso é diferente dos comandos acima, que essencialmente reescrevem as permissões (ou seja, para alterar uma permissão de r--para rw-, você ainda precisa incluir o comando re wdepois =o chmodcomando no comando. Se você perdeu r, a rpermissão seria retirada como eles estão sendo reescritos com o =. Usando + e - evite isso adicionando ou removendo o conjunto atual de permissões).

Método numérico

chmod também pode definir permissões usando números.

O uso de números é outro método que permite editar as permissões para todos os três proprietários, grupos e outros ao mesmo tempo. Essa estrutura básica do código é esta:

chmod xxx file/directory

Onde xxx é um número de 3 dígitos, em que cada dígito pode ter de 1 a 7. O primeiro dígito se aplica às permissões do proprietário, o segundo dígito se aplica às permissões do grupo e o terceiro dígito se aplica às permissões de todos os outros.

Nesta notação numérica, os valores r, we ex têm seu próprio valor numérico:

r=4
w=2
x=1

Para criar um número de três dígitos, é necessário considerar quais permissões você deseja que um proprietário, grupo e usuário tenham e totalizar seus valores. Por exemplo, digamos que eu queira conceder ao proprietário de um diretório permissões de leitura e gravação e execução, e que eu deseje agrupar e todos os outros apenas ter permissões de leitura e execução. Eu apresentaria os valores numéricos da seguinte forma:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Isso equivale a usar o seguinte:

chmod u=rwx filename
chmod go=rx filename

A maioria das pastas / diretórios é definida como 755 para permitir a leitura, gravação e execução para o proprietário, mas nega a gravação para todos os outros, e os arquivos são normalmente 644 para permitir a leitura e gravação para o proprietário, mas apenas a leitura para todos os demais, consulte a última nota sobre a falta de permissões x com arquivos não executáveis ​​- é a mesma coisa aqui.


Apenas copiar texto de outro artigo é - pelo menos - rude. Talvez também uma violação de direitos autorais. Se ele não é apenas copiado ou você realmente usou peças pequenas (direitos autorais graças ao uso justo), adicione pelo menos um link ao artigo que você está referenciando / citando.
rugk

0

Para as perguntas d

Isso indica o tipo de arquivo Unix. Por padrão, o Unix possui apenas 3 tipos de arquivos. Eles são:

  • - - Arquivo regular
  • d - arquivo de diretório
  • Arquivo especial (com 5 subtipos):
    • b - Bloquear arquivo
    • c - Arquivo de dispositivo de caractere
    • p - Arquivo de pipe nomeado ou apenas arquivo de pipe
    • l - Arquivo de link simbólico
    • s - arquivo de soquete

Leia mais aqui: Tipos de arquivos no Linux / Unix explicados em detalhes

0777 vs 777

Bit pegajoso especificado ou não. Quando o bit pegajoso de um diretório é definido, o sistema de arquivos os trata nesses diretórios de uma maneira especial, de modo que apenas o proprietário do arquivo, o proprietário do diretório ou o usuário raiz possa renomear ou excluir o arquivo. Sem o conjunto de bits fixos, qualquer usuário com permissões de gravação e execução para o diretório pode renomear ou excluir arquivos contidos, independentemente do proprietário do arquivo.

0777 define 777 permissões de arquivo e o bit fixo como 0 - sem modos especiais.

777 está definindo permissões de arquivo 777, sem alterar o bit fixo.

Leia mais: bit pegajoso e chmod


2
Melhor: mas ainda não oferece nada que as outras respostas não o tenha coberto ...
jasonwryan

11
(1) Existem três tipos básicos de arquivos: arquivos simples, diretórios e tudo mais. O que? Onde você está conseguindo isso? No grande esquema das coisas, arquivos e diretórios simples são bem parecidos. Canais nomeados e links simbólicos são mais arquivos e diretórios simples do que arquivos ou soquetes de dispositivos. (2) Você acha chmod 777que não limpa os bits setuid, setgid e sticky? Tente.
G-Man

Unix tem 7 tipos de arquivos, não 3.
wjandrea
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.