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 -l
mostra 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 terusers
em 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 denosuid
enodev
, 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
.