사용자의 홈 디렉토리에서 파일 권한을 수정해야합니다. 다시 넣고

누구나 디렉토리에 대한 파일 권한을 재귀 적으로 수정하는 도구 또는 스크립트가 있습니까?

Ubuntu Linux 시스템에서 많은 파일이 전체 777 권한 (사용자, 그룹, 기타-읽기, 쓰기, 실행)이있는 USB 디스크로 복사되었습니다. 수정 된 사용자 디렉토리에 다시 넣고 싶습니다.

디렉토리는 775 여야하고 다른 모든 파일은 664가 될 수 있습니다. 모든 파일은 이미지, 문서 또는 MP3이므로 실행 파일 일 필요는 없습니다. 디렉토리 비트가 설정되면 실행이 필요하고, 그렇지 않으면 사용자와 그룹, 읽기 및 쓰기가 필요합니다.

쉘 스크립트를 함께 해킹하기 전에 그러한 유틸리티가 존재하는지 확인할 가치가 있다고 생각했습니다. 🙂



답변

트릭을 수행해야합니다.

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664


답변

-exec를 사용하여 트릭을 혼자 할 수 있습니다.

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

find가 각 항목에 대해 chmod를 생성하지 못하게하려면 다음을 수행하십시오.

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

(이것은 파일 당 하나의 chmod가 아닌 매개 변수로 모든 파일 목록을 사용하여 chmod를 한 번 효과적으로 호출합니다)


답변

이 답변으로 문제를 해결할 수는 없지만 파일보다 권한이 적은 유사한 문제에 유용 할 수 있습니다.

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

마술은 x가 아니라 X 권한입니다. chmod 맨 페이지는 다음과 같이 설명합니다.

파일이 디렉토리이거나 이미 일부 사용자에게 실행 권한이있는 경우에만 실행 / 검색

파일에 실행 권한이 있으므로 두 번째 테스트와 일치하므로 귀하의 경우에는 적합하지 않습니다.


답변

freiheit의 솔루션으로 스크립트를 작성했으며 기본 인수 확인을 추가합니다.

#!/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


답변

ssh를 사용하는 경우 ~/.ssh권한 을 수정하지 않는 것이 좋습니다 .

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


답변

다른 날 권한을 수정해야했기 때문에 정말 간단한 bash 스크립트를 만들었습니다. 루트가 아닌 기본 파일 및 폴더 권한을 재설정하는 공식적인 유틸리티가없는 이유는 무엇입니까?

이 스크립트는 find를 사용하여 755 개의 모든 폴더와 644 개의 라이브러리를 사용합니다. 그런 다음 readelf를 사용하여 각 파일을 테스트하여 이진 엘프 헤더가 있는지 확인합니다. 그렇지 않은 경우 처음 두 문자에서 shebang을 스캔합니다 #!. 파일에 이미 일치 권한이 있는지 확인한 후 해당 인스턴스를 755 개로 설정하고 그 밖의 모든 것을 644 개로 만듭니다.

특별한 경우는 *.bak파일 무시 와 같은 예외를 처리 합니다.

#!/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


답변

단순화 된 C- 쉘 솔루션을 찾았습니다. 이것은 완벽하지는 않지만 대부분의 디렉토리에서 작동합니다. 유닉스 ‘file’명령이 작동한다고 가정하고 exec 파일을 찾아서 exec 권한으로 다시 재설정합니다.

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775