it-swarm-ko.tech

실수로 디렉토리에서 chmod -R + x. 올바른 권한을 어떻게 복원합니까?

구체적으로 말하자면 chmod -R 755입니다. 이제 모든 파일이 실행 가능하므로 원하지 않습니다. #!에 대해 각 파일의 처음 2 바이트를 살펴 봐야한다고 생각하는데, 여기에 모든 것이 포함됩니까? 대신 file을 (를) 사용하여 모든 것을 살펴보고 그에 따라 결정을 내려야합니까? 아니면 더 나은 방법이 있습니까?

디렉토리를 재귀 적으로 살펴보고 실행 가능하지 않은 파일에 -x를 설정하는 선호하는 방법은 무엇입니까?

21
Larry Wang

여기에는 마법의 총알이 없습니다. 권한은 항상 중복되지 않는 정보를 전달합니다.

시스템 디렉토리에서이 작업을 수행했다면 setuid 및 setgid 비트, 세계에서 읽을 수없는 파일 및 파일에 대해 걱정해야하기 때문에 시스템이 매우 나쁜 상태가됩니다. 그룹 또는 세계 쓰기 가능해야합니다.

사용자 별 디렉터리에서는 세계에서 읽을 수없는 파일에 대해 걱정해야합니다. 아무도 당신을 도울 수 없습니다.

실행 가능성에 관해서는, 실행될 수있는 것처럼 보이지 않는 모든 것을 실행 불가능하게 만드는 것이 좋은 경험 규칙입니다. 커널은 처음 2 바이트가 #! 인 스크립트, 처음 4 바이트가 \x7fELF 인 ELF 바이너리를 실행할 수 있습니다. 여기서 \x7f는 값이 12 인 바이트, 더 희귀 한 파일 몇 개를 실행할 수 있습니다. 유형 (a.out, binfmt_misc에 등록 된 모든 것). 따라서 다음 명령은 권한을 적절한 상태로 복원해야합니다 (bash 4 또는 zsh라고 가정하고 그렇지 않으면 find를 사용하여 디렉토리 트리를 탐색하고 경고, 브라우저에 직접 입력).

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Linux 및 ACL 지원이있는 다른 유니스에서 디렉토리 트리의 권한을 백업하고 복원하는 간단한 방법이 있습니다.

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

나는 당신이 뭔가를 원할 것이라고 믿습니다.

find dir -type f -exec chmod ugo-x '{}' +

이것은 dir에서 재귀 적으로 모든 일반 파일을 찾고 (디렉토리 및 장치 제외) 실행 가능 비트를 제거합니다.

여기서 시작하여 실행 가능하고 실행 가능한 파일을 만드는 방식으로 작업합니다.

다음은 요청한대로 정확하게 작동합니다 (모든 일반 파일을 찾고 #!에 대해 grep 한 다음 찾을 수없는 경우 x 비트를 제거합니다).

find . -type f | xargs grep -L #! | xargs chmod ugo-x

아마도 위의 더 나은 버전 (더 적은 파이프)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
6
xenoterracide

Shebang 줄이 없으면 파일은 명목상 /bin/sh를 사용하여 쉘 스크립트로 실행됩니다. 당신은 좋은 시작이라고 생각하고 문제의 디렉토리에 미션 크리티컬 파일이 포함되어 있지 않다고 가정하면 grepchmod 콤보를 실행하는 데 큰 위험이 없을 것입니다. 가양 성, 즉 실행 가능한 비트가 설정되지 않은 Shebang 라인이있는 파일을 접할 수 있지만 디렉토리에있는 내용의 목적에 대한 자세한 정보를 알지 못하는 경우에만 사용자에게 중대한 실존 적 위협이되는지를 결정할 수 있습니다. 시스템 및/또는 데이터.

0
gvkv