Como posso encontrar apenas os ficheiros executáveis sob um determinado directório no Linux?
Como posso encontrar apenas os ficheiros executáveis sob um determinado directório no Linux?
Como posso encontrar apenas os ficheiros executáveis sob um determinado directório no Linux?
A verificação de ficheiros executáveis pode ser feita com -perm
(não recomendado) ou -executable
(recomendado, pois tem em conta o ACL). Para utilizar a opção -executable
:
find <dir> -executable
se quiser encontrar apenas ficheiros executáveis e directórios não pesquisáveis, combine com -type f
:
find <dir> -executable -type f
Use a opção find’s -perm
. Isto irá encontrar ficheiros no directório actual que são executáveis pelo seu dono, por membros do grupo ou por outros:
find . -perm /u=x,g=x,o=x
Editar:
Eu acabei de encontrar outra opção que está presente pelo menos no GNU find 4.4.0:
find . -executable
Isto deve funcionar ainda melhor porque as ACLs também são consideradas.
Sei que a pergunta menciona especificamente o Linux, mas como é o primeiro resultado no Google, só queria acrescentar a resposta que procurava (por exemplo, se for - como eu neste momento - obrigado pelo seu empregador a utilizar um sistema não GNU/Linux).
Testado em macOS 10.12.5
find . -perm +111 -type f
Eu tenho outra abordagem, caso o que você realmente quer é apenas fazer algo com ficheiros executáveis - e não necessariamente forçar a procura para se filtrar:
for i in `find -type f`; do [-x $i] && echo "$i is executable"; done
Prefiro isto porque não depende de -executable
que é específico da plataforma; e não depende de -perm
que é um pouco arcano, um pouco específico da plataforma, e como escrito acima requer que o ficheiro seja executável para todos (não apenas para si).
O -type f
é importante porque nos directórios *nix tem de ser executável para ser percorrível, e quanto mais a consulta estiver no comando find
, mais eficiente será a memória do seu comando.
De qualquer forma, apenas oferecendo outra abordagem, uma vez que *nix é a terra de mil milhões de abordagens.
Um ficheiro marcado como executável não precisa de ser um ficheiro ou objecto 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
Como ventilador do único liner…
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Usando ‘xargs’ para tirar a saída do comando find (usando print0 para garantir que os nomes de arquivos com espaços são manuseados corretamente). Temos agora uma lista de ficheiros que são executáveis e fornecemos, um a um, como parâmetro para o comando ‘file’. Depois o grep para o termo ASCII para ignorar os binários. Por favor substitua -executable no comando find por qual estilo prefere (ver respostas anteriores) ou o que funciona no seu ‘NIX OS
Eu exigi o acima descrito para encontrar ficheiros com eval em scripts propriedade do root, por isso criei o seguinte para ajudar a encontrar pontos fracos de escalada de privacidade onde o utilizador root corre 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 &
Esta noite criei uma função em ~/.bashrc
para encontrar ficheiros executáveis não no caminho do sistema e não em directórios:
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
A vantagem é que vai procurar três distros Linux e uma instalação Windows num segundo em que o comando find
demora 15 minutos.
Por exemplo:
$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate
real 0m0.504s
user 0m0.487s
sys 0m0.018s
Ou para um directório inteiro e todos os seus subs:
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s