Como recuperar do recursivo 'chmod -x' na minha pasta pessoal

2

Eu pressionei ENTER depois de digitar o seguinte comando estúpido no meu diretório pessoal:

find . -type f -exec chmod -x '{}' ';'

O que você aconselha como uma correção para isso. Meu palpite é que não posso fazer nada além de fazer algo como:

find . -type f -exec chmod og+x '{}' ';'

Ou pode ser algo complicado baseado em extensões (o que não parece muito pertinente no Linux).

Ou talvez alguns de vocês tenham uma idéia ou um ponteiro sobre como saber qual arquivo deve ser executável no linux e como detectá-los para voltar a executá-los ...

    
por Gauthier Boaglio 18.03.2014 / 23:23

3 respostas

6

Aqui está um script que escrevi um tempo atrás para corrigir permissões em arquivos copiados de um sistema FAT. Não funcionará se os nomes dos arquivos contiverem novas linhas (embora, se alguém quiser corrigi-lo, fique à vontade):

#!/bin/sh

[ $# != 0 ] && dir="$1" || dir=.

[ -d "$dir" ] || { echo "usage: $0 [dir]"; exit 1; }

cat <<- EOF
  Will recursively alter permissions under directory '$dir'.
  Consider backing up permissions with 'getfacl -R $dir' first.
  Continue? [Y/n]"
EOF

read reply
[ "$reply" = Y ] || exit 0

echo "Changing all directories to mode 755..."
find "$dir" -type d -exec chmod 755 {} +

# simplest way for now is just to make all files non executable, then fix ones which should be
echo "Changing all files to mode 644..."
find "$dir" -type f -exec chmod 644 {} +

# use a temp file instead of a variable since the shell will strip nulls from the string
tmpfile=$(mktemp)

# screwed if filename contains a newline - fixable with a better sed script
echo "Using magic to find executables..."
find $dir -type f -exec file -hN0 -e apptype -e cdf -e compress -e elf -e tar -e tokens {} + |
  sed -n '/\x0.*executable/p' >"$tmpfile"

# ELF binaries
echo "\nSetting ELF executables to mode 755...\n"
sed '/\x0.*ELF/!d; s/\x0.*$//' "$tmpfile" | xargs -rd '\n' chmod -c 755

scripts=$(sed '/\x0.*text/!d; s/\x0.*$//' "$tmpfile")

IFS="
"

# only make scripts executable if they have a shebang
echo "\nSetting scripts with a shebang to mode 755...\n"
for file in $scripts
do
  head "$file" | grep -q '^#!' && chmod -c 755 "$file"
done

rm "$tmpfile"
    
por 18.03.2014 / 23:39
3

Uma opção é deixá-lo como está e descobrir permissões executáveis ausentes quando você precisar dos arquivos.

No entanto, você pode ser mais esperto do que isso. Primeiro de tudo, se você usar .sh extensões em scripts de shell, você pode chmod-los com find. Semelhante para scripts perl e python. Além disso, você pode percorrer os arquivos e procurar o #! na primeira linha, se existir, tornar o arquivo executável.

Por último, os binários compilados podem ser detectados com file . Por exemplo:

file clock_test
clock_test: ELF 64-bit LSB executable, x86-64, version 1 .......

Qual você pode testar com | grep ELF . Assim, você poderia simplesmente escrever um script que testa todas essas opções e corrigir as permissões se ele adivinhar que deve ser executável.

    
por 18.03.2014 / 23:29
1

Aqui está como nós costumávamos consertar isso nos velhos tempos (c. 1984)!

Agora, no seu caso, foi a partir do seu diretório pessoal, o que torna menos provável que essa solução específica o ajude, mas, como outras pessoas podem se deparar com essa solicitação E o farão de / , /usr , ou outro diretório de alto nível, vale a pena considerar.

  1. Vá para outro servidor executando o mesmo sistema operacional. Se você não tiver um, instancie-o no Amazon Web Services (AWS). Ele provavelmente se qualificará como uma instância gratuita, considerando o pouco trabalho que será necessário para obter uma listagem de referência da árvore de diretórios afetada.

  2. em uma cópia limpa do sistema operacional, ls -lR > /tmp/clean da pasta na qual você iniciou seu arquivo recursivo munging

  3. faça o mesmo a partir da sua pasta no computador, exigindo a correção

  4. você provavelmente usará cut para remover as datas e os tamanhos, pois eles podem diferir das diferenças de versão menor / maior.

  5. diff os dois arquivos salvando a saída

  6. use a saída para encontrar os arquivos em que as permissões não correspondem.

Outra abordagem seria ler a saída da listagem do sistema operacional limpo e usá-la para aplicar às permissões corretas no sistema operacional afetado.

Espero que isso seja útil para alguém de fora.

    
por 19.03.2014 / 05:35