음, 구체적으로는 그렇습니다 chmod -R 755
. 이제 모든 파일이 실행 가능해졌습니다. 저는 이것을 원하지 않습니다. 각 파일의 처음 2바이트를 살펴봐야 할 것 같은데 #!
, 그게 모든 것을 다룰 수 있을까요? file
모든 것을 살펴보고 그에 따라 결정을 내려야 할까요 ? 아니면 더 좋은 방법이 있을까요?
디렉토리를 재귀적으로 순회하고 실행 가능하지 않은 파일에 -x를 설정하는 가장 좋은 방법은 무엇입니까?
답변1
여기에는 마법의 총알이 없습니다. 권한에 의해 전달되는 정보가 항상 중복되는 것은 아닙니다.
시스템 디렉토리에서 이 작업을 수행하면 setuid 및 setgid 비트는 물론 누구나 읽을 수 없는 파일, 그룹 또는 그룹이어야 하는 파일에 대해 걱정해야 하기 때문에 시스템이 매우 나쁜 상태가 됩니다. 세계적으로 쓰기 가능합니다.
각 사용자의 디렉터리에서는 모든 사람이 읽을 수 없는 파일에 대해 걱정해야 합니다. 당신을 도와줄 사람은 아무도 없습니다.
집행가능성에 관해서는, 집행 불가능해 보이는 것은 모두 집행할 수 없게 두는 것이 좋은 경험 법칙입니다. 커널은 처음 2바이트가 #!
12인 바이트인 ELF 바이너리, 값이 12인 바이트인 ELF 바이너리 및 일부 희귀한 파일 유형(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
ACL을 지원할 수 있는 Linux 및 기타 unices에서는 디렉터리 트리에 대한 권한을 쉽게 백업하고 복원할 수 있는 방법이 있습니다.
getfacl -R >saved-permissions
setfacl --restore=saved-permissions
답변2
나는 당신이 다음과 같은 것을 원할 것이라고 확신합니다
find dir -type f -exec chmod ugo-x '{}' +
그러면 dir에서 모든 일반 파일(디렉토리 및 장치 제외)을 반복적으로 찾아 실행 가능한 비트를 제거합니다.
여기서부터 시작하여 실행 가능한 파일을 만드는 작업을 하겠습니다.
다음은 요청한 대로 정확하게 작동해야 합니다(모든 일반 파일을 찾고 그 파일에서 #!를 찾은 다음 찾을 수 없으면 x 비트를 제거합니다).
find . -type f | xargs grep -L #! | xargs chmod ugo-x
아마도 위 버전보다 더 나은 버전일 것입니다(파이프 수가 적음).
find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x
답변3
Shebang 라인 이 없으면 파일 은 명목상 /bin/sh
. 많은 위험. Shebang 줄이 있는 파일이 실행 비트가 설정되었음을 의미하지 않는다는 오탐이 발생할 수 있지만 디렉터리 내용의 목적에 대한 추가 정보가 없으면 이것이 자신의 존재에 문제가 되는지 여부만 결정할 수 있습니다. 시스템 및/또는 데이터에 대한 위협.grep
chmod