Não há nenhum risco direto de segurança ao tornar um arquivo executável, a menos que seja setuid ou setgid. É claro que existe o risco indireto de que algo que você espera que seja inerte - algum arquivo de dados que você normalmente abriria em um aplicativo - também pode ser executado diretamente em seu sistema, com consequências nefastas. Por exemplo, se você tem um arquivo chamado README que realmente contém um programa de rootkit, abri-lo em um editor de texto é seguro, mas é melhor não executá-lo.
Uma heurística razoável para reconhecer arquivos que devem ser executáveis é examinar seus primeiros bytes e reconhecer assinaturas executáveis. Isso é uma questão de conveniência e não de segurança, mas se você estiver disposto a tornar todos os arquivos executáveis de qualquer maneira, isso significa que você não tem uma preocupação de segurança, mas uma preocupação de usabilidade de qualquer maneira. Aqui está uma possível heurística:
for x in *; do
case $(file - <"$x") in
*executable*) chmod +x -- "$x";;
esac
done
Aqui está outra heurística que deve diferir apenas nos casos de canto ( $'7'
é a sintaxe ksh / bash / zsh, substitua-a por um caractere literal 0177 = 127 = 0x7f em outros shells).
for x in *; do
case $(head -c 4 <"$x") in
'#!'*|$'7'ELF) chmod +x -- "$x";;
esac
done
Em ambos os casos, só porque um arquivo é reconhecido como executável não significa que você possa executá-lo em seu sistema; por exemplo, um binário para a arquitetura incorreta do processador será felizmente executado. Aqui está uma abordagem diferente que torna todos os scripts executáveis, mas binários vinculados dinamicamente somente se eles forem para a arquitetura correta e você tiver as bibliotecas necessárias e perder completamente binários estaticamente vinculados.
for x in *; do
case $(head -c 2 <"$x") in
'#!') chmod +x -- "$x";;
*) if ldd -- "$x" >/dev/null 2>/dev/null; then chmod +x "$x"; fi;;
esac
done