Configure corretamente o bit de execução com base no tipo de arquivo?

2

Estou tentando limpar as permissões em um servidor da web Apache. Eu estou encontrando muitos arquivos com o bit de execução que não costumam tê-lo (ou não deveria tê-lo):

$ sudo find /var/www/html -executable -type f | grep '.png'
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
...

Como posso definir o bit de execução para arquivos regulares que habitualmente o possuem (como programas, páginas PHP e scripts Bash); e removê-lo de arquivos regulares que habitualmente não o possuem (como arquivos TXT, PNG, JPG e ZIP)?

Eu sinto que find com -exec e chmod devem entrar em ação em algum lugar. Eu também espero que o mecanismo de seleção leve em consideração os shebangs e outros cabeçalhos mágicos; e não apenas confiar em um bit de execução [potencialmente incorreto] ou em uma extensão [potencialmente ausente]. Mas minha busca não está chegando na resposta certa. Cf., Como posso encontrar apenas os arquivos executáveis em um determinado diretório no Linux? e Encontre arquivos executáveis recursivamente .

    
por jww 03.07.2016 / 03:57

2 respostas

4

Isso passará pelos seus arquivos e definirá o bit executável de acordo com o fato de file acreditar que o arquivo deve ser executável:

find /var/www/html -type f -exec bash -c 'if file -b "$1" | grep -q executable; then chmod +x "$1"; else chmod -x "$1"; fi' None {} \;

O comando find é muito parecido com o seu. A mudança é a adição dos comandos bash. Pode ser mais simples compreendê-los se estiverem espalhados por várias linhas como esta:

if file -b "$1" | grep -q executable
then
    chmod +x "$1"
else
    chmod -x "$1"
fi

Você pode, é claro, modificar o argumento chmod para atender às suas necessidades específicas.

    
por 03.07.2016 / 04:19
1

Eu não sei qual é o seu caso de uso, mas raramente tenho arquivos executáveis na minha pasta da web. E nas máquinas de produção eu também removo permissão de gravação para a maioria dos arquivos.

Para casos espaciais eu mantenho um arquivo separado que inclui todos os casos específicos, como quais pastas precisam de permissão de escrita ou um proprietário diferente, e usá-lo para sobrescrever os padrões.

find /path/to/webroot/ -type f -exec chmod 644 -c '{}' \;
find /path/to/webroot/ -type d -exec chmod 755 -c '{}' \;
# change owner 
chmod root:www-data /path/to/webroot/ -R

bash .fix-perm

onde .fix-perm é apenas um arquivo de script

#.fix-perm
chmod g+w cache -R
chmod g+w logs -R
    
por 03.07.2016 / 11:56