구체적으로 말하자면 chmod -R 755
. 이제 모든 파일이 실행 가능하므로 원하지 않습니다. 에 대한 각 파일의 처음 2 바이트를 봐야한다고 생각 #!
하지만 모든 것을 다룰 것입니까? 대신 file
모든 것을보고 그 결정에 근거하여 사용해야합니까? 아니면 더 좋은 방법이 있습니까?
'실행 가능하지 않은'파일에 대해 재귀 적으로 디렉토리를 탐색하고 -x를 설정하는 선호되는 방법은 무엇입니까?
/
, 내가 완전히 소유 한 디렉토리.
구체적으로 말하자면 chmod -R 755
. 이제 모든 파일이 실행 가능하므로 원하지 않습니다. 에 대한 각 파일의 처음 2 바이트를 봐야한다고 생각 #!
하지만 모든 것을 다룰 것입니까? 대신 file
모든 것을보고 그 결정에 근거하여 사용해야합니까? 아니면 더 좋은 방법이 있습니까?
'실행 가능하지 않은'파일에 대해 재귀 적으로 디렉토리를 탐색하고 -x를 설정하는 선호되는 방법은 무엇입니까?
/
, 내가 완전히 소유 한 디렉토리.
답변:
여기에 마법의 총알이 없습니다. 권한에는 항상 중복되는 정보가 없습니다.
시스템 디렉토리에서이 작업을 수행했다면 setuid 및 setgid 비트와 세계가 읽을 수없는 파일 및 파일에 대해 걱정해야하므로 시스템 상태가 매우 나빠질 수 있습니다. 그룹 또는 세계 쓰기 가능해야합니다.
사용자 별 디렉토리에서는 세계가 읽을 수없는 파일에 대해 걱정해야합니다. 아무도 당신을 도울 수 없습니다.
실행 가능성과 관련하여 좋은 경험 규칙은 실행 불가능한 것처럼 보이지 않는 모든 것을 실행 불가능하게 만드는 것입니다. 커널은 그 처음 두 바이트 스크립트를 실행할 수있는 #!
, 그 제 4 바이트이다 ELF 바이너리 값 12, 몇 희소 파일 형식 (a.out을, 아무것도 등록과 바이트이다 ). 따라서 다음 명령은 권한을 적절한 상태로 복원해야합니다 (bash 4 또는 zsh를 가정하고 그렇지 않으면 디렉토리 트리를 탐색하는 데 사용 합니다 (경고는 브라우저에 직접 입력)).\x7fELF
\x7f
binfmt_misc
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
**/*
해야합니다 globstar
.
find
는 글로브 스타보다는 사용 하십시오. 둘째, 머리 file
를 보지 않고 명령을 사용하여 머리 를보고 거기에서 분기합니다.
find
보다 신뢰성 globstar
, globstar
거의 모든 경우에 바람직하다.
나는 당신이 같은 것을 원할 것이라고 믿습니다.
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
grep -L '^#!'
(따옴표가 필요하고, 적어도를 ^
제한하는 줄의 시작 부분에 매칭)하지만 일치로 아직도 너무 관대의 #!
모든 줄에. xargs
공백이나 인용 문자가 포함 된 파일 이름에는 사용 이 실패합니다. 사용 xargs -d '\n'
(GNU 필요 xargs
).
shebang 줄이 없으면 파일은 명목상으로 셸 스크립트로 실행됩니다 /bin/sh
. 당신은 좋은 출발이라고 생각합니다. 문제의 디렉토리에 미션 크리티컬 파일이 포함되어 있지 않다고 가정하면 일부 grep
및 chmod
콤보 를 실행할 위험이 거의 없습니다 . 허위 긍정 (예 : 실행 비트가 설정되어 있지 않지만 디렉토리에있는 목적에 대한 추가 정보를 알지 못하는 shebang 행이있는 파일)이 발생할 수 있습니다. 시스템 및 / 또는 데이터.
#!
.
/
다른 디렉토리 에서 했습니까 ?