Precisa corrigir permissões de arquivo no diretório inicial de um usuário

18

Alguém tem uma ferramenta ou script que corrigirá recursivamente as permissões de arquivo em um diretório?

Em uma máquina Ubuntu Linux, vários arquivos foram copiados para um disco USB com permissões 777 completas (usuário, grupo, outros - ler, gravar, executar) com erro. Eu quero colocá-los de volta no diretório do usuário corrigido.

Os diretórios devem ser 775 e todos os outros arquivos podem ser 664. Todos os arquivos são imagens, documentos ou MP3s, portanto nenhum deles precisa ser executável. Se o bit de diretório estiver configurado, ele precisará de execução; de outro modo, ele só precisa de usuário e grupo, ler e gravar.

Eu achei que valia a pena verificar se tal utilitário existia antes de hackear um shell script:)

    
por mlambie 02.07.2009 / 16:58

6 respostas

43

Isso deve funcionar:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664
    
por 02.07.2009 / 17:04
11

encontrar pode fazer o truque sozinho com -exec:

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

para evitar que o encontro crie um chmod para cada entrada:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(isso efetivamente chama chmod uma vez com a lista de todos os arquivos como parâmetros, em vez de um chmod por arquivo)

    
por 02.07.2009 / 17:14
5

Esta resposta não resolve o seu problema, mas alguém pode achá-la útil para um problema semelhante em que os arquivos têm menos permissão do que deveriam.

# chmod -R . u=rwX,g=rX,o=rX

A mágica é a permissão X, ao invés de x. A chmod manpage descreve da seguinte forma:

execute/search only if the file is a directory or already has execute permission for some user

Isso não é adequado no seu caso, pois seus arquivos têm permissão de execução, portanto, corresponderá ao segundo teste.

    
por 02.07.2009 / 17:42
1

Eu fiz um script com a solução do freiheit, ele adiciona a verificação básica de argumentos.

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644
    
por 24.01.2017 / 19:07
0

Caso você esteja usando o ssh, é uma boa ideia não modificar ~/.ssh permissões.

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664
    
por 12.11.2016 / 15:25
0

Eu fiz um script muito simples no outro dia porque precisava corrigir as permissões. Por que não há um utilitário formal para redefinir as permissões básicas de arquivos e pastas, não raiz?

O script usa find para 755 todas as pastas e 644 bibliotecas. Em seguida, ele testa cada arquivo com o readelf para ver se ele possui um cabeçalho elf binário. Se não, ele digitaliza nos dois primeiros caracteres para shebang #! . Ele 755 essas instâncias e 644 todo o resto depois de verificar se o arquivo já tem a permissão correspondente.

Casos especiais são tratados com uma exceção como *.bak para arquivos a serem ignorados.

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi
    
por 22.07.2018 / 00:37