it-swarm-pt.tech

Eu acidentalmente chmod -R + x em um diretório. Como restauro as permissões corretas?

Bem, para ser específico, foi chmod -R 755. Agora, todo arquivo é executável, o que eu não quero. Estou pensando que devo olhar os primeiros dois bytes de cada arquivo para o #!, mas isso vai cobrir tudo? Em vez disso, devo usar file para ver tudo e basear minha decisão nisso? Ou, mais provavelmente, há uma maneira ainda melhor de fazer isso?

Qual é a maneira preferida de passar recursivamente por um diretório e definir -x em arquivos que não são 'supostamente' executáveis?

21
Larry Wang

Não há solução mágica aqui. As permissões carregam informações que nem sempre são redundantes.

Se você tivesse feito isso em um diretório do sistema, seu sistema estaria em um estado muito ruim, porque você teria que se preocupar com os bits setuid e setgid, e com os arquivos que não deveriam ser lidos por todos e com os arquivos que devem ser graváveis ​​em grupo ou em todo o mundo.

Em um diretório por usuário, você precisa se preocupar com arquivos que não deveriam ser lidos por todos. Ninguém pode te ajudar aí.

Quanto à executabilidade, uma boa regra seria fazer com que tudo o que não pareça que possa ser executado seja não executável. O kernel pode executar scripts cujos primeiros dois bytes são #!, Binários ELF cujos primeiros quatro bytes são \x7fELF Onde \x7f é o byte com o valor 12 e alguns tipos de arquivo mais raros (a.out, qualquer coisa registrada com binfmt_misc). Portanto, o seguinte comando deve restaurar suas permissões para um estado razoável (assume bash 4 ou zsh, caso contrário, use find para percorrer a árvore de diretórios; aviso, digitado diretamente no navegador):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Observe que há uma maneira simples de fazer backup e restaurar as permissões de uma árvore de diretórios no Linux e possivelmente em outros unices com suporte ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
15

Eu acredito que você vai querer algo como

find dir -type f -exec chmod ugo-x '{}' +

Isso procura todos os arquivos regulares, recursivamente em dir (exclui diretórios e dispositivos) e remove o bit executável.

Eu começaria aqui e, em seguida, trabalharia para criar arquivos que deveriam ser executáveis, executáveis.

O seguinte deve funcionar exatamente como você pediu (ele encontrará todos os arquivos regulares, execute grep por #! E, em seguida, remova os x bits se não forem encontrados)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

possivelmente uma versão melhor do anterior (menos tubos)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
6
xenoterracide

Bem, sem uma linha Shebang, o arquivo será executado como um script Shell, nominalmente com /bin/sh. A sua ideia é um bom começo e, supondo que o diretório em questão não contenha arquivos de missão crítica, provavelmente não há muito risco de executar algum combo grep e chmod. Você pode encontrar falsos positivos, ou seja, arquivos com uma linha Shebang que não devem ter seu bit executável definido, mas sem saber mais informações sobre a finalidade do que está no diretório, apenas você pode decidir se isso representa uma ameaça existencial significativa para o seu sistema e/ou dados.

0
gvkv