As permissões do arquivo dizem que é executável, mas o arquivo não é executável. Existem três razões pelas quais isso pode acontecer.
- Você não aprofundou o suficiente nas permissões de arquivo - existe uma lista de controle de acesso que torna o arquivo não executável para você. Você pode ver a ACL de um arquivo com o comando
getfacl /path/to/file. Esse não é o caso aqui, poisls -lmostra que não há ACL no arquivo (haveria+no final das permissões, por exemplo,-rwxr-xr-x+). - O arquivo é armazenado em um volume montado com a opção
noexec. Esta opção está implícita por terusersem uma linhafstab(se você quiser tornar um sistema de arquivos montável pelo usuário e permitir que os usuários executem arquivos nele, usenoauto,users,exec). Essa opção de montagem faz com que todos os arquivos comuns sejam não executáveis, independentemente de suas permissões. - O arquivo é um script que faz referência a um interpretador que não é executável em sua linha shebang ou a um binário vinculado dinamicamente que faz referência a um carregador dinâmico que não é executável. Este não é o caso aqui dado que copiar o arquivo resulta em um arquivo que você pode executar (e
/usr/bin/envé executável de qualquer maneira).
Por um processo de eliminação, o arquivo está em um volume montado com a opção noexec .
As únicas soluções alternativas são:
- Não monte o volume com a opção
noexec. Esta opção não tem implicações de segurança (ao contrário denosuidenodev, que fazem). É principalmente útil para sistemas de arquivos sem noção de permissões de execução, onde você pode escolher entre tornar tudo executável ou nada. - Copie o arquivo antes de executá-lo.
- Use uma montagem de bind ou bindfs para criar uma visão do sistema de arquivos onde os arquivos executáveis são executáveis.
- Invoque o interpretador ou o carregador dinâmico explicitamente, por exemplo aqui
bash helloworld.sh. Isso não executahelloworld.sh, ele executa/bin/bash, que lêhelloworld.sh.