Questão Como posso encontrar apenas os arquivos executáveis ​​em um determinado diretório no Linux?


Como posso encontrar apenas os arquivos executáveis ​​em um determinado diretório no Linux?


124


origem


Aqui está uma espécie de script BASH, não é ruim é o que posso dizer :) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
Que tal usar o padrão file comando? - Breakthrough
Para quem quiser fazer isso em um Mac (testado no OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$'  O acima listará todos os executáveis ​​(para todos / usuário e grupo) no diretório atual. Nota: O -executable opção não funciona em um Mac, portanto, a solução acima. - techfoobar
Também relevante: Unix find: procura por arquivos executáveis - Slothworks
@techfoobar: A questão é ambígua: significa arquivos que contêm código executável ou arquivos que possuem permissão executável? Mas mesmo se assumirmos que a permissão executável é o que é desejado (como parece a maioria das respostas), a pergunta não diz executável pelo mundo. Sua solução irá encontrar arquivos (e também fifos, sockets, symlinks, etc.) que tenham permissão de execução mundial, mas não 750 (-rwxr-x---), que ainda é executável para alguns usuários. - G-Man


Respostas:


A verificação de arquivos executáveis ​​pode ser feita com -perm (não recomendado) ou -executable (recomendado, uma vez que leva ACL em conta). Para usar o -executable opção:

find <dir> -executable

se você quiser encontrar apenas arquivos executáveis ​​e diretórios não pesquisáveis, combine com -type f:

find <dir> -executable -type f

124



um shebang não significa que eles são executáveis. nos diz apenas qual intérprete usar. e por definição de linux “arquivos executáveis” são arquivos com o conjunto de bits executável (x) - knittl
Qual versão do find suporta esse tipo para o tipo? homem encontrar listas b, c, d, p, f, l, se D no meu sistema. - innaM
O mesmo aqui, meu achado não tem um -type x ou. - davr
Se você tem uma versão antiga do find (provavelmente antes de 4.3.8) que não tem uso executável, ache. -perm / u = x, g = x, o = x. - Ludwig Weinzierl
find: invalid predicate -executable' no RHEL - SSH This


Use o achado -perm opção. Isso localizará os arquivos no diretório atual que são executáveis ​​pelo proprietário, pelos membros do grupo ou por outros:

find . -perm /u=x,g=x,o=x

Editar:

Acabei de encontrar outra opção que está presente pelo menos no GNU find 4.4.0:

find . -executable

Isso deve funcionar ainda melhor porque as ACLs também são consideradas.


26



Isso só funciona em uma versão mais recente do find. Aquele que vem por padrão com o CentOS dá o erro find: invalid mode / u = x, g = x, o = x'` - davr
Então você deve tentar a versão "-perm +" que agora está obsoleta no GNU find: find. -perm +111 " - innaM
Parece que -perm /111 pode ser a versão mais portátil. - Scott


Eu sei que a questão menciona especificamente o Linux, mas como é o primeiro resultado no Google, eu só queria adicionar a resposta que estava procurando (por exemplo, se você é - como eu no momento) forçado pelo seu empregador a usar um não GNU / Sistema Linux).

Testado em Mac OS 10.12.5

find . -perm +111 -type f

4



Funciona no RHEL 5 também. - José Tomás Tocino


Eu tenho outra abordagem, no caso do que você realmente quer é apenas fazer algo com arquivos executáveis ​​- e não necessariamente forçar o find a se filtrar:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Eu prefiro isso porque não depende de -executable que é específico da plataforma; e não depende de -perm o que é um pouco arcano, um pouco específico da plataforma e, como descrito acima, requer que o arquivo seja executável para todos (não apenas para você).

o -type f é importante porque nos diretórios * nix tem que ser executável para ser percorrido, e quanto mais a consulta está no find comando, quanto mais memória eficiente seu comando será.

De qualquer forma, apenas oferecendo uma outra abordagem, já que * nix é a terra de um bilhão de abordagens.


3



(0) Qual você prefere, arcano e correto ou intuitivo e falho? Eu prefiro correto. (1)resposta de innaM, apresentando find -perm, encontra arquivos que qualquer executar conjunto de bits de permissão. (2) Por outro lado, esta resposta encontra apenas arquivos para os quais o usuário atual tem permissão de execução. É claro que isso pode ser o que o OP quer, mas não está claro. … (Cont.) - Scott
(Cont’d)… (3) Para maior clareza, você pode querer mudar `…` para $(…) - Vejo esta, estae esta. (4) Mas não faça for i in $(find …); do …; ele falha em nomes de arquivos que contêm espaço (s). Em vez disso, faça find … -exec …. (5) E, quando você trabalha com variáveis ​​de shell, sempre as cite (entre aspas duplas), a menos que tenha uma boa razão para não fazer isso e tenha certeza de que sabe o que está fazendo. - Scott
@scott OK, eu estou corrigido :) eu li o -perm argumento como exigir todos os três, não um deles. Além disso, obrigado pela entrada na proteção dos argumentos do shell, isso é tudo que eu não conhecia. - Mark McKenna
@MarkMcKenna você tem um erro de digitação lá: for i in encontrar . tipo f; do [ -x $i ] && echo "$i is executable"; done; você está faltando a parte <dir>, que eu uso um ponto (.) - Devy


Um arquivo marcado como executável não precisa ser um arquivo ou objeto executável ou carregável.

Aqui está o que eu uso:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2



O que isso faz? - DerMike
@DerMike, é uma das maneiras de encontrar executável no diretório atual, incluindo arquivos .so, mesmo que um arquivo não esteja marcado como executável, ele pode descobrir. - AjayKumarBasuthkar
Bem, quero dizer como Isso faz isso? - DerMike
Ele lê o cabeçalho do arquivo para descobrir, todo arquivo binário ou arquivo de script tem cabeçalho. - AjayKumarBasuthkar
Até onde sei, -name "*" não tem efeito sobre find - normalmente encontra todos os arquivos que não são eliminados pelos testes. - G-Man


Como fã de um forro ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Usando 'xargs' para obter a saída do comando find (usando print0 para assegurar que nomes de arquivos com espaços sejam manipulados corretamente). Agora temos uma lista de arquivos que são executáveis ​​e nós os fornecemos, um por um, como o parâmetro para o comando 'file'. Então grep para o termo ASCII ignorar binários. Por favor, substitua -executável em encontrar comando com o estilo que você preferir (veja respostas anteriores) ou o que funciona no seu 'NIX OS

Eu exigi o acima para encontrar arquivos com eval em scripts de propriedade de root, então criei o seguinte para ajudar a encontrar fraquezas de escalação priv em que o usuário root executa scripts com parâmetros inseguros ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

1



Isso não funcionará se o script contiver caracteres não-ASCII. filerelata a codificação, portanto, um script python pode ser relatado como a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF' poderia funcionar melhor para identificar os não-binários. - xenoid