Eu acidentalmente chmod -R + x em um diretório. Como faço para restaurar as permissões corretas?

18

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

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

    
por Larry Wang 27.08.2010 / 21:03

3 respostas

13

Não há bala 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 setuid e setgid bits, e sobre arquivos que não deveriam ser legíveis pelo mundo, e sobre arquivos que devem ser escritos em grupo ou mundo.

Em um diretório por usuário, você precisa se preocupar com arquivos que não devem ser legíveis para o mundo. Ninguém pode te ajudar lá.

Quanto à executabilidade, uma boa regra seria fazer com que tudo que não pareça ser executado, não seja 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 arquivos mais raros (a.out, qualquer coisa registrada com %código%). Portanto, o seguinte comando deve restaurar suas permissões para um estado razoável (assume bash 4 ou zsh, caso contrário use binfmt_misc 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 permissões de uma árvore de diretórios, no Linux e possivelmente em outros unices com suporte a ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
    
por 27.08.2010 / 23:23
6

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 depois trabalharia no sentido de criar arquivos que deveriam ser executáveis, executáveis.

O seguinte deve funcionar exatamente como você pediu (ele encontrará todos os arquivos regulares, grep-los para #! e, em seguida, remova os x bits se não for encontrado)

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

possivelmente uma versão melhor do acima (menos canos)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
    
por 27.08.2010 / 22:22
0

Bem, sem uma linha shebang, o arquivo será executado como um script de shell, nominalmente com /bin/sh . Sua idéia é um bom começo e, na suposição de que o diretório em questão não contém arquivos de missão crítica, provavelmente não há muito risco de executar alguns grep e chmod combo. 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 o propósito do diretório, apenas você pode decidir se isso representa uma ameaça existencial significativa para o seu diretório. sistema e / ou dados.

    
por 27.08.2010 / 21:42