5
respostas

chmod/permissões

Olá, tenho umas dúvidas quanto aos arquivos e chmod. Criei o arquivo "oi" como feito na aula, e percebi que o professor teve que dar permissão para ele usando o comando chmod no arquivo que ele mesmo criou. As dúvidas são: se eu criei o arquivo, por que devo ME dar permissão para execute? e todos os momentos parecidos serão iguais? Obrigado!

5 respostas

Existe uma série de questões históricas que levam a isso.

Para começar, um arquivo de shell script (sh) é apenas um arquivo de texto. Sabemos que você vai querer que todo script seja executável, mas você vai querer que todo arquivo de texto que não seja um shell script também seja criado com permissões para execução? Provavelmente não, porque se você tiver um arquivo com receita de bolo nele você vai querer que o sistema a abra e leia, não que execute a receita, então não faz sentido fazer com que todo arquivo de texto seja executável por padrão já que nem sempre que você vai criar um arquivo de texto isso significa que o arquivo vai ser um script.

Outra questão é segurança. Seria um pouco arriscado dar permissão de execução para qualquer arquivo de texto criado pois, se por qualquer motivo você digitar dados inválidos dentro desse arquivo ou se o arquivo tiver qualquer informação que pode ser executada, mas que você não esperava que poderia ser executada, você pode acabar danificando seu sistema de forma não intencional. Imagina que dentro de uma receita de bolo o seu shell sem querer assume que você quer apagar um outro arquivo ou sobrescrever alguma coisa e você executa ao invés de ler a receita... nada bom!

Entre diversas outras questões também que vão desde como inodes funcionam e como arquivos são criados na hora da execução de uma syscall, mas aí é um papo bem mais complexo que talvez futuramente você aprenda sobre.

Espero ter ajudado. :)

Certo, mas não é pra isso que servem as extensões de arquivo? tipo, não sei se realmente faz diferença ou não, mas percebi que quando é pra fazer um script, faço um arquivo de texto sem a extensão ".txt". Não seria esse o motivo de colocar ou não a extensão?

Aí que a gente ataca um equívoco muito grande em relação a tipos de arquivos: a extensão não define o tipo de arquivo!

Sim, as extensões são extremamente úteis na hora de identificar o arquivo que você está prestes a lidar, mas você pode facilmente renomear um arquivo.txt para arquivo.jpg e esse arquivo não vai magicamente virar uma imagem. Quer fazer um teste?

$ echo "isso é um arquivo de texto" > arquivo.jpg
$ cat arquivo.jpg
isso é um arquivo de texto

Então, não, nem sempre um executável terminando em .sh vai ser um shell script. Entre diversos outros, um dos grandes motivos pelo qual colocamos a extensão é por conveniência. Um usuário comum provavelmente não vai encontrar muitos casos em que a extensão não representa o formato real do arquivo e os programas conseguem lidar mais facilmente com arquivos sem precisar fazer checks mais complexos porque isso gastaria poder de processamento desnecessário.

Ok, então como a gente identifica o tipo de um arquivo então? Existem várias formas, a mais precisa sendo a verificação dos chamados magic numbers e signatures, números únicos que identificam arquivos independentemente de suas extensões. No Linux você também vai encontrar bastante os chamados mimetypes e a famosa hashbang.

Entendi o que você disse na última parte, e obrigado, certamente, ajudou. Consegui captar a ideia, porém tem muita coisa escrita que eu ainda não compreendo. Partindo do que você disse no primeiro e segundo período, realizei os testes que pediu e, realmente, o texto não se transforma numa imagem, e se usar o comando "cat", ele ainda é reconhecido como texto normalmente no terminal, mas ao tentar abri-lo normalmente com duplo clique, o sistema o trata como se fosse uma imagem comum, resultando em um erro, pois não há, de fato, uma imagem ali. Então, minha dúvida ainda persiste e acrescento mais uma pergunta: por que não define o tipo de arquivo, se coisas assim acontecem? Peço desculpas se estou sendo chato, mas acho interessante ter uma discussão assim, tendo em vista que não se encontra fácil por aí...

Heh, não se preocupa em ser "chato", chato seria se você não aprendesse nada do que está sendo discutido aqui. Pode ter certeza de que um dia eu fiz essas mesmas perguntas e alguém me ajudou a entender melhor como tudo isso funciona.

Respondendo sua pergunta, por que então o computador ainda continua tentando abrir o arquivo de texto como se fosse uma imagem? Como em alguns dos artigos que citei dizem, pra achar o chamado magic number o seu programa precisa fazer uma análise hexadecimal do arquivo que está lendo (você pode fazer isso você mesmo usando ferramentas como o xxd) e isso é algo que pode ser ou muito complexo de se implementar ou pode ser desnecessariamente intensivo computacionalmente: pra fazer a leitura dos primeiros bytes do seu executável você teria que ler o arquivo e caso os magic numbers não sejam os esperados você leu o arquivo em vão. É muito mais simples apenas verificar a extensão, assim você não precisa de fato ler o arquivo e raramente você vai encontrar um arquivo com um tipo diferente da sua extensão, como no nosso caso do arquivo.jpg.

Então é bem relativo, o seu software de gerenciamento de arquivos decidiu chamar um visualizador de imagens porque decidiu que não precisa fazer esse check mais complexo, os desenvolvedores escolheram que seria melhor assim, mas alguns programas como o 7z por exemplo conseguem inferir o tipo do arquivo independentemente da extensão e vai te avisar se você tentar descompactar um zip que não é, de fato, um zip:

$ mv arquivo.jpg arquivo.zip
$ 7z x arquivo.zip
[...]
ERRORS:
Is not archive
[...]

Assim como o inverso:

$ mv arquivo_zip_valido.zip arquivo_zip_valido.jpg
$ 7z x arquivo.jpg
[...]
Type = zip
Everything is Ok
[...]