Alguém fez uma pergunta no Ask Ubuntu sobre por que eles obtiveram permission denied
quando entraram em um shell Bash
/etc/profile
Eu sei que isso ocorre porque o arquivo não tem permissão de execução. Mesmo o root não pode executá-lo ( sudo /path/to/file/with/no/execute/bits
falha com o erro não informativo sudo /path/to...: command not found
). Também sei que o root pode entrar em um diretório sem bits de execução, então a proibição absoluta de executar arquivos não executáveis parece especial. No bate-papo, Eliah Kagan opinou que o motivo pelo qual o root não seria capaz de executar arquivos não executáveis era protegê-lo (presumivelmente, de executar códigos perigosos acidentalmente).
Eu brevemente me perguntei por que alguém iria querer executar /etc/profile
e pensei que se alguém quisesse executá-lo, provavelmente iria querer source
(porque é um arquivo de configuração que define as variáveis de ambiente e shell). Percebi então que a permissão de execução não é necessária para source
nenhum arquivo regular. Mas source
executa o arquivo no shell atual! O arquivo pode conter qualquer comando e . file
irá em frente e executá-lo.
Se a permissão de execução for restrita para impedir a execução acidental de código potencialmente perigoso, por que é possível executar arquivos não executáveis usando o source
comando?
Não acho que a execução de um arquivo não executável falhe de propósito para evitar a execução acidental de código potencialmente perigoso. É apenas parte da semântica de
execve
: falha comEACCES
"Permissão de execução negada para o arquivo ou um script ou interpretador ELF". (Estou citando a página de manual do Linuxexecve
. POSIX diz algo semelhante: “A permissão de pesquisa é negada para um diretório listado no prefixo de caminho do novo arquivo de imagem do processo ou o novo arquivo de imagem do processo nega a permissão de execução.”) Unix/Linux nunca tem se preocupado particularmente em evitar que os usuários estraguem os próprios pés.Acho que a explicação é bem mais prosaica: as especificações de execução e sourcing são diferentes. A execução direta pede ao kernel para executar um determinado comando e isso impõe privilégios de execução. O fornecimento de um arquivo é apenas especificado como lê-lo e executá-lo; na verdade, a página de
bash
manual declara explicitamente que “O arquivo procuradoPATH
não precisa ser executável”. POSIX diz “Ao contrário da pesquisa de comando normal, no entanto, o arquivo pesquisado pelo utilitário dot não precisa ser executável.” (.
é equivalente asource
.)Observe que você pode executar binários mesmo quando eles não são executáveis, usando uma técnica semelhante à sua origem:
O argumento de Kusalananda sobre comparar '
bash
ssource
e POSIX.
é interessante. No modo não-POSIX, sesource
for dado um argumento sem caminho, ele tenta encontrá-lo noPATH
, e se não encontrar, procura no diretório atual; no modo POSIX não, porque o POSIX proíbe isso:Isso realmente não muda muito na discussão em questão, já que um argumento com um caminho será processado por
source
ou.
em qualquer caso. (E realmente você deve sempre usar um caminho, mesmo que apenas relativo, parasource
argumentos, para evitar surpresas quando tentarsource
algo que também está em seuPATH
arquivo . Tente criar um arquivo nomeadotest
e forneça-o comsource test
inbash
para ver o que quero dizer.)