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


24

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

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

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

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


답변:


51

트릭을 수행해야합니다.

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

1
-print0 / xargs -0 :-) 사용시 +1
sleske 2009

14

-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를 한 번 효과적으로 호출합니다)


6
모든 파일에 대해 chmod를 포크 할 때 xargs를 사용하는 것보다 속도가 느립니다. 여기서 xargs는 명령 줄에 맞는만큼 많은 파일을 사용하여 chmod 프로세스를 실행합니다. 매우 큰 나무에서 이것은 공정한 차이를 만들 수 있습니다.
David Pashley

1
또한 print0 / xargs -0은 매우 이상한 파일 이름도 처리합니다. find -exec에 대해 확실하지 않습니다.
sleske 2009

8

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

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

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

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

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


1
g는 775와 664에서 rwX 여야합니다.
aventurin

1

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

좋은 생각. 그러나 대상이 디렉토리 인 경우 두 번째 행에 오류가 발생합니다 chmod: missing operand after ‘0644’. 대상이 존재하는지 확인하기 위해 확인 문으로 find 문을 랩핑하는 것이 좋습니다. if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
언더 벌스

거의 맞습니다. 그러나 대상이 디렉토리이면 파일을 chmod하는 것을 잊었고 파일 인 경우 해당 파일 만 chmod하면됩니다.
sean

0

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

0

다른 날 권한을 수정해야했기 때문에 정말 간단한 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

0

단순화 된 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

1
이것은 일부 답변을 반복하는 것이 아니라 OP가 요청하지 않은 오류와 기능을 소개합니다.
RalfFriedl

0

원래 요청에 정확하게 응답하지는 않지만 OP가 의도 한 것보다 더 나은 대안은 권한을 기호로 지정하는 것입니다. 예를 들어, OP는 "공개에 대한 쓰기 액세스 권한을 제거하고 모든 파일에서 실행 권한을 제거하고 싶다"고 가정합니다.

기호 권한 표현을 사용하는 경우 가능합니다.

  • "공개에서 쓰기 액세스를 제거하십시오"( "o"-기타, "-"-제거, "w"-쓰기)
  • ax는 "파일의 모든 사람에 대해서만 실행 제거"( "a"-모두, "-"-제거, "x"-실행)

"0664"를 명시 적으로 설정하는 대신이 방법으로 작성하면 실수로 이전에 잠겨있는 파일에 대한 추가 권한을 허용하지 않습니다. 예를 들어, 파일이 0770 인 경우 실수로 0664가되지 않습니다.

첫 번째 요구 사항을 수행하려면 다음을 사용할 수 있습니다 chmod.

chmod --recursive o-w $dir

두 번째 요구 사항을 수행하려면

find $dir -type f -exec chmod a-x {} +

또는 두 가지를 모두 수행하십시오.

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.