Executando um script no zsh - permissões de arquivo

16

Estou confuso sobre as permissões de execução de arquivos que não se comportam como eu esperava. Provavelmente porque minhas expectativas estão erradas. De qualquer forma:

Eu tenho um arquivo de script, pois a simplicidade é chamada s, localizada em ~/bin. Para fins deste exemplo, o arquivo contém apenas as seguintes linhas:

#!/bin/zsh
echo "Test";

Muito simples.

Navego até o ~/bindiretório e chmodas permissões de arquivo de spara 400- ou seja, somente leitura somente para mim. Nenhuma permissão de execução. Então, eu tento executar o script digitando seu caminho, fornecendo o seguinte:

% ./s
zsh: permission denied: ./s

Por enquanto, tudo bem. O arquivo não pode ser executado devido a permissões incorretas. Aumentar as permissões até 500(permissão de execução concedida) também funciona bem - com essas permissões, o arquivo executa bem:

% ./s
Test

Isso é tudo como esperado. Mas, então, as chmodpermissões voltam para 400(executar a permissão novamente), tentando sourceo arquivo, e isso acontece:

% source s
Test

Embora as permissões sejam 400, o script é executado.

Então, aqui está a minha pergunta: por que ./sfalha (como deveria), mas é source sexecutada normalmente? Isso não derrota todo o objetivo da permissão de execução?

Em 400permissões, sh se zsh stambém funciona.

Tenho certeza de que estou fazendo ou entendendo algo terrivelmente errado em algum lugar. Pode alguém apontar onde a mim, e explicar a diferença entre ./s, source s, sh se zsh s?

C106
fonte

Respostas:

17

Quando você executa ./s, você diz ao kernel para executar o programa s. Se você tem permissão de execução, o kernel lê os primeiros bytes do arquivo, vê a #!linha para saber que é um script e executa o intérprete, passando o nome do script como primeiro argumento. Se você não tem permissão de execução, o kernel anula a execução na primeira etapa.

Ao executar zsh s, você executa zshe solicita que ele leia o arquivo chamado se o interprete como comandos. Você não está executando s, você está executando zsh. A mesma coisa comsh s ou cat s.

Quando você executa source s, novamente, você diz ao zsh para ler um arquivo, então o que importa é que você tenha permissão de leitura nele.

Gilles 'SO- parar de ser mau'
fonte
Ok, isso faz sentido. Mas isso não derrota completamente o ponto de ter a permissão de execução? Não importa se está definido ou não, eu sempre poderei executar o script (ou dizer ao zsh para interpretar os comandos no script, o que é equivalente).
C106
Além disso, cat sapenas imprime o conteúdo do arquivo. cat s | zshpassa zshe imprime Test.
C106
1
@ C106 O objetivo da permissão de execução é indicar que o arquivo representa algo que você pode executar sem informações adicionais. Também é importante se o arquivo for setuid / setgid. Um arquivo pode não ter permissão de execução, mas mesmo assim consiste em instruções de que algum programa de computador é executado em algum lugar.
Gilles 'SO- stop be evil' (
Isso faz muito sentido e é realmente incrivelmente óbvio. Obrigado.
C106