Eu nunca entendi como chmod
funcionava até hoje. Eu segui um tutorial que explicou muitas coisas para mim.
Por exemplo, eu li que você tem três grupos de permissão diferentes:
- proprietário (
u
) - grupo (
g
) - todos (
o
)
Com base nesses três grupos, agora sei que:
- Se o arquivo pertence ao usuário, as permissões do usuário determinam 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 for no grupo, a outra permissão é usada.
Também descobri que você tem as seguintes permissões:
- read (
r
) - write (
w
) - execute ()
Criei um diretório para testar meu conhecimento recém-adquirido:
mkdir test
Então 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 algum tempo, acho que finalmente peguei o jeito de chmod
e a maneira como você define a permissão usando este comando.
Mas …
Ainda tenho algumas perguntas:
- O que faz o
d
no início representa? - Qual é o nome e o uso do slot que o contém e quais outros valores ele pode conter?
- Como posso definir e cancelar a definição?
- Qual é o valor para este
d
? (Como você só tem 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1) - Por que as pessoas às vezes usam
0777
em vez de777
para definir suas permissões?
Mas como não devo fazer várias perguntas, tentarei fazer em uma pergunta.
Em sistemas baseados em UNIX, como todas as distribuições Linux, em relação às permissões, o que a primeira parte (d
) representa e qual é a usar para esta parte das permissões?
Comentários
Resposta
Vou responder às 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 em ls -l
output representa o tipo de arquivo; d
significa que é um diretório. Não pode ser definido ou desmarcado, depende de como o arquivo foi criado. Você pode encontrar a lista completa de tipos de arquivo na documentação do ls ; aqueles que você provavelmente encontrará são
-
-
: arquivo “normal”, criado com qualquer programa que pode escrever um arquivo -
b
: arquivo especial de bloco, normalmente disco ou dispositivos de partição, pode ser criado commknod
-
c
: arquivo especial de caractere, também pode ser criado commknod
(consulte/dev
para exemplos) -
d
: diretório, pode ser criado commkdir
-
l
: link simbólico, pode ser criado comln -s
-
p
: pipe nomeado, pode ser criado commkfifo
-
s
: socket, pode ser criado comnc -U
-
D
: porta , criada por alguns processos de servidor no Solaris / openindiana.
Permissões
chmod 0777
é usado para definir todas as permissões em uma chmod
execuçã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
,sgid
e “aderente” (veja abaixo) - permissões de usuário
- permissões de grupo
- “outras” permissões
O octal o valor é calculado como a soma das permissões:
- “ler” é 4
- “escrever” é 2
- “executar” é 1
Para o primeiro dígito:
-
suid
é 4; binários com este conjunto de bits são executados como seu usuário proprietário (normalmenteroot
) -
sgid
é 2; binários com este conjunto de bits são executados como seu grupo de proprietários (isso foi usado para jogos para que pontuações altas pudessem ser compartilhadas, mas muitas vezes é um risco de segurança quando combinado com vulnerabilidades nos jogos), e os arquivos criados em diretórios com este conjunto de bits pertencem o grupo do proprietário do diretório por padrão (isso é útil para criar pastas compartilhadas) - “sticky” (ou “exclusão restrita”) é 1; arquivos em diretórios com este conjunto de bits só podem ser excluídos por seu proprietário, o proprietário do diretório ou
root
(consulte/tmp
para um exemplo comum deste).
Consulte a chmod
página de manual para obter 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, ACLs de arquivo …).
Bits especiais são tratados de forma diferente dependendo do tipo de arquivo (regular arquivo ou diretório) e o sistema subjacente. (Isso é mencionado na página de manual chmod
.) No sistema que usei para testar isso (com coreutils
8,23 em um ext4
sistema de arquivos, executando o kernel Linux 3.16.7-ckt2), o comportamento é o seguinte. Para um arquivo, os bits especiais são sempre limpos, a menos que sejam explicitamente definidos, então chmod 0777
é equivalente a chmod 777
e ambos os comandos limpam os bits especiais e dar a todos permissões totais no arquivo. Para um diretório, os bits especiais nunca são totalmente apagados usando a forma numérica de quatro dígitos, portanto, chmod 0777
também é equivalente a chmod 777
mas é enganoso, pois alguns dos bits especiais permanecerão como estão. (Uma versão anterior desta resposta errou.) Para limpar bits especiais nos diretórios, você precisa usar u-s
, g-s
e / ou o-t
explicitamente ou especifique um valor numérico negativo, então chmod -7000
limpará todos os bits especiais em um diretório.
Na saída ls -l
, suid
, sgid
e “sticky” aparecem no lugar de x
entrada: suid
é s
ou S
em vez de x
do usuário, sgid
é s
ou S
em vez de x
do grupo, e“ sticky ”é t
ou T
em vez de outros x
. Uma letra minúscula indica que o bit especial e o bit executável estão definidos; uma letra maiúscula indica que apenas o bit especial está definido.
As várias formas de chmod
Devido ao comportamento descrito acima, usando os quatro dígitos completos em chmod
pode ser confuso (pelo menos descobri que estava confuso). É útil quando você deseja definir bits especiais, bem como bits de permissão; caso contrário, os bits são apagados se você estiver manipulando um arquivo e preservados se você estiver manipulando um diretório. Portanto, chmod 2750
garante que você receberá pelo menos sgid
e exatamente u=rwx,g=rx,o=
; mas chmod 0750
não limpará necessariamente os bits especiais.
Usando 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ê estiver acostumado a usar os modos numéricos, geralmente é mais fácil apenas especificar o modo completo dessa maneira; e é útil poder pensar em permissões usando modos numéricos, já que muitos outros comandos podem usá-los (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+x
fará isso, independentemente do que as outras permissões são. Da mesma forma, +X
adiciona 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; isso pode ser útil para restaurar permissões globalmente sem a necessidade de arquivos de casos especiais v. diretórios. Assim, chmod -R ug=rX,u+w,o=
é equivalente a aplicar chmod -R 750
a todos os diretórios e arquivos executáveis e chmod -R 640
para todos os outros arquivos.
Comentários
- Embora as outras respostas tenham sido muito boas, você realmente gastou algum tempo respondendo a essa pergunta. Obrigado.
- Em diretórios * BSD, se comportar como se seu
sgid
bit estivesse sempre definido, independentemente de seu valor real. No FreeBSD, o bitsuid
pode ser configurado para agir de forma análoga asgid
(ou seja, arquivos e subdiretórios criados dentro terão o mesmo dono do diretório ), desde que o sistema de arquivos subjacente suporte isso e seja montado com a opçãosuiddir
. - ”
+X
adiciona 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 você @ stephen-kitt, sem a documentação ” já configurada ” estava realmente me deixando confuso!
Resposta
Portanto, as permissões no Linux são muito importantes. Tentarei fazer uma breve explicação.
Para partes de um modo de arquivo
Cada arquivo Unix possui um conjunto de permissões que determinam se você pode ler, escrever ou executar o arquivo. Executar ls -l exibe as permissões. Aqui está um exemplo de exibição:
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Eu anexei uma imagem de partes de um modo de arquivo:
O tipo pode ser diferente. Por exemplo:
- d (diretório)
- c (dispositivo de caractere)
- l (link simbólico)
- p (nomeado tubo)
- s (soquete)
- b (dispositivo de bloco)
- D (porta, não comum em sistemas Linux, mas foi portado)
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 comando chmod
geralmente espera a entrada para ser um número octal, o zero à esquerda se refere ao valor do trio de bits sticky / sgid / suid. Em C, no entanto, faria diferença, uma vez que 777
seria traduzido para 01411
(octal), definindo assim o bit sticky (consulte a página do manual chmod(2)
), permissões de leitura para o proprietário e bit executável para grupo e outros (o que é uma combinação bastante estranha).
EDIT 1
Encontrei outra foto sobre as permissões do Linux e vou anexar para entender mais facilmente:
Comentários
- Você está errado sobre o 777 vs 0777. Ambos são octais (decimal não faz sentido em neste caso), mas na forma de quatro caracteres, o primeiro dígito define os bits especiais (sticky & setuid).
- @orion Ocasionalmente, é verdade, por exemplo em um código semelhante ao C
chmod(777)
seria realmente o equivalente a executarchmod 1411
(ou seja, ochmod
comando com o argumento1411
). - … que no caso de syscall (ou seu invólucro) e o binário com o mesmo nome pode ser um pouco confuso.
- O Python Master Race resolveu esse problema inverso banindo todos os ” números ” que começavam com 0 , forçando o usuário a ser explícito se quiser algo diferente de decimal, por exemplo hex:
0x1FF
, binário:0b111111111
ou octal:0o777
. PYTHON POWER - Fonte da imagem?
Resposta
d
significa que é um diretório, se você tiver um arquivo, é -
e se for um link, você encontrará um l
. Não pode ser definido / desmarcado.
Se você usar 0777 como permissões, estará dando controle total (leitura + gravação + execução) a cada usuário / grupo do sistema. É uma maneira preguiçosa de resolver problemas quando você tem usuários / grupos que não podem “acessar diretórios / arquivos.
Por exemplo, se você listar o conteúdo de um diretório e obtiver isto:
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
preloadable_libintl.so é um arquivo pertencente ao usuário root e ao grupo root. O proprietário tem acesso de leitura e gravação, o grupo tem acesso apenas de leitura e qualquer outro usuário tem acesso de leitura. Isso pode ser traduzido como 644.
Se eu alterar para 777, ficará assim:
-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so
Resposta
Depois de obter minha pergunta respondida aqui e fazer algumas pesquisas sobre o resultado, encontrei um artigo que explica tudo muito bem. Eu gostaria de compartilhar algumas partes deste artigo aqui para referências futuras.
Permissões de visualização
Para usar chmod
para alterar as permissões de um arquivo ou diretório, você primeiro precisa saber o que modo de acesso é. Você pode visualizar o conteúdo de um diretório no terminal cd
para esse diretório e usar:
$ ls -l
A opção -l
é importante porque usar ls
sem ele exibirá apenas os nomes dos arquivos ou pastas no diretório.
Abaixo está um exemplo de uso de ls -l
em meu diretório inicial:
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:
-
-
denota um arquivo normal. -
d
denota um diretório, ou seja, uma pasta contendo outros arquivos ou pastas. -
p
denota um pipe nomeado (também conhecido como FIFO ). -
l
denota um link simbólico.
As letras depois disso são as permissões, esta primeira coluna é o que estaremos mais interessados. O segundo é quantos links existem em um arquivo, podemos ignore-o 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 informações depois disso 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 significam as permissões
As três primeiras letras, após as primeiras -
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
w
e x
. r
está sempre na primeira posição, w
está sempre na segunda posição e x
está 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 permissão. Se houver um hífen (-
) no lugar de uma dessas letras, significa que a permissão não foi concedida e, se a letra estiver presente, ela foi concedida.
Pastas
No caso de pastas, os bits de modo podem ser interpretados da seguinte forma:
-
r
(ler) significa para a capacidade de ler o índice do diretório fornecido, -
w
(gravação) significa a capacidade de escrever o índice do diretório fornecido (criar novos arquivos, pastas; renomear, excluir arquivos e pastas existentes) se e somente se executar bit estiver definido. Caso contrário, essa permissão não tem sentido. -
x
(executar) significa a capacidade de entrar em um determinado diretório com o comando cd e acessar arquivos e pastas nesse diretório.
Alterando permissões usando o comando chmod
chmod
é um comando no Linux e em outros sistemas operacionais semelhantes ao Unix. Ele permite que você altere as permissões (ou modo de acesso) de um arquivo ou diretório.
Você pode alterar as permissões de duas maneiras diferentes: – Baseado em texto chmod
– Baseado em número chmod
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 é qualquer uma de uma variedade de letras, e cada uma significa a quem você vai dar permissão . Elas são as 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 já discutidas (r
, w
e x
).
O comando chmod nos 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 r
, bem como w
após =
no chmod
comando. Se você perder r
, ele tiraria a permissão r
, pois eles estão sendo reescritos com o =. Usin g + e – evite isso adicionando ou retirando o conjunto atual de permissões).
Método numérico
chmod
também pode definir permissões usando números.
Usar números é outro método que permite editar as permissões para todos os três proprietários, grupos e outros ao mesmo tempo. Esta estrutura básica do código é a seguinte:
chmod xxx file/directory
Onde xxx é um número de 3 dígitos onde cada dígito pode ser qualquer coisa de 1 a 7. O primeiro dígito se aplica às permissões para o proprietário, o segundo dígito se aplica às permissões para o grupo e o terceiro dígito se aplica às permissões para todos os outros.
Nesta notação numérica, os valores r, w e x têm seu próprio número valor:
r=4 w=2 x=1
Para chegar a um número de três dígitos, você precisa considerar quais permissões deseja que um proprietário, grupo e usuário tenham e, em seguida, total seus valores para cima. Por exemplo, digamos que eu quisesse conceder ao proprietário de um diretório permissões de leitura e gravação e de execução, e quisesse agrupar e todos os outros para apenas ler e executar permissões. Eu chegaria com os valores numéricos assim:
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 é o equivalente a usar o seguinte:
chmod u=rwx filename chmod go=rx filename
A maioria das pastas / diretórios são configurados para 755 para permitir leitura e gravação e execução para o proprietário, mas nega gravação para todos os outros, e os arquivos são normalmente 644 para permitir leitura e gravação para o proprietário, mas apenas lendo para todos os outros, consulte a última nota sobre a falta de permissões x com arquivos não executáveis – é o mesmo aqui.
Comentários
- Apenas copiar texto de outro artigo é – pelo menos – rude. Talvez também uma violação de direitos autorais. Se não foi apenas copiado ou você realmente usou pequenas partes (direitos autorais graças ao uso justo), então, pelo menos, adicione um link para o artigo que você está referenciando / citando.
Resposta
Para as questões d
Isso informa o tipo de arquivo Unix. Por padrão, o Unix tem apenas 3 tipos de arquivos. Eles são:
-
-
– Arquivo normal -
d
– Arquivo de diretório - Arquivo especial (com 5 subtipos):
-
b
– Bloquear arquivo -
c
– Arquivo de dispositivo de caracteres -
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 arquivo em Linux / Unix explicados em detalhes
0777
vs 777
Bit aderente especificado ou não. Quando o sticky bit de um diretório é definido, o sistema de arquivos trata os arquivos nesses diretórios de uma maneira especial, de forma que apenas o proprietário do arquivo, o proprietário do diretório ou o usuário root possam renomear ou excluir o arquivo. Sem o sticky bit definido, qualquer usuário com permissões de gravação e execução para o diretório pode renomear ou excluir os arquivos contidos, independentemente do proprietário do arquivo.
0777
define 777 permissões de arquivo , e o sticky bit para 0 – sem modos especiais.
777
está definindo 777 permissões de arquivo, sem alterar o sticky bit.
Leia mais: sticky bit e chmod
Comentários
- Melhor: mas ainda não oferece nada que as outras respostas não tenham ‘ já coberto …
- ( 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 muito semelhantes. Pipes nomeados e links simbólicos são mais como arquivos simples e diretórios do que arquivos de dispositivos ou soquetes. (2) Você acha que
chmod 777
não limpa os bits setuid, setgid e sticky? Experimente. - Unix tem 7 tipos de arquivo, não 3.
Resposta
Duas coisas relacionadas que “sempre achei confusas, e não mencionei acima, são:
I) que “ 1 ” faz:
Em chmod
: cada “1” en permite uma permissão, por exemplo, chmod 777 en ables todos, mas preste atenção porque
em umask
: each “1” dis permite uma permissão, por exemplo, umask 777 dis ables todos.
II ) arquivo “proprietários” vs.arquivo “usuários” :
Em outras palavras, existem usuários que “possuem” e usuários que “usam” .
Cada arquivo é de propriedade , ao mesmo tempo, por duas entidades:
- um único usuário específico, e
- um único, específico group (de um ou mais usuários).
Portanto, cada arquivo pode ser usado por um usuário específico de três maneiras:
1) Diretamente, como o usuário que possui o arquivo,
2) em diretamente, como um membro do grupo que possui o arquivo, e
3 ) possivelmente, como outra pessoa.
Caso contrário, , o respostas acima, faça um ótimo trabalho! Obrigado a todos.
S_IFDIR
. Você não ‘ não o usa ao definir o modo de arquivo, mas a funçãostat()
realmente retorna o valor 040750 paradrwxr-x---
.