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