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


20

구체적으로 말하자면 chmod -R 755. 이제 모든 파일이 실행 가능하므로 원하지 않습니다. 에 대한 각 파일의 처음 2 바이트를 봐야한다고 생각 #!하지만 모든 것을 다룰 것입니까? 대신 file모든 것을보고 그 결정에 근거하여 사용해야합니까? 아니면 더 좋은 방법이 있습니까?

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


이 작업을 /다른 디렉토리 에서 했습니까 ?
gvkv

1
@gvkv : Not /, 내가 완전히 소유 한 디렉토리.
Larry Wang

1
@Larry 앞으로는 모든 권한을 강요하지 않고 모든 파일에 쓰기를 유발하는 대신 + x 변형을 사용해야합니다.
xenoterracide

@xenoterracide : 동의합니다. 내가 정말로 원했던 것은 그룹과 나에게 동일한 권한을 부여하는 것이 었습니다 (결국 끝났습니다!), 나는 타이핑하기 전에 충분한 생각을하지 못했습니다.
Larry Wang

우리는 몇 개의 파일에 대해 이야기하고 있습니까? 몇 개나 실행 가능해야합니까? 파일 이름을 알 수있는 방법이 있습니까?
David Thornley

답변:


15

여기에 마법의 총알이 없습니다. 권한에는 항상 중복되는 정보가 없습니다.

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

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

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

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.
Chris Down

이 스크립트를 두 가지로 변경하는 것이 좋습니다. 하나 find는 글로브 스타보다는 사용 하십시오. 둘째, 머리 file를 보지 않고 명령을 사용하여 머리 를보고 거기에서 분기합니다.
Shadur

@Shadur는 find보다 신뢰성 globstar, globstar거의 모든 경우에 바람직하다.
Chris Down

1
@Gilles "만약 있다면 훨씬 뛰어나다"는 것이 더 빠를뿐만 아니라 더욱 안정적 일뿐만 아니라 예상치 못한 SNAFU도없는 것처럼 선호됩니다.
Chris Down

6

나는 당신이 같은 것을 원할 것이라고 믿습니다.

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 

3
확인 grep -L '^#!'(따옴표가 필요하고, 적어도를 ^제한하는 줄의 시작 부분에 매칭)하지만 일치로 아직도 너무 관대의 #!모든 줄에. xargs공백이나 인용 문자가 포함 된 파일 이름에는 사용 이 실패합니다. 사용 xargs -d '\n'(GNU 필요 xargs).
Gilles 'SO- 악마 그만'

0

shebang 줄이 없으면 파일은 명목상으로 셸 스크립트로 실행됩니다 /bin/sh. 당신은 좋은 출발이라고 생각합니다. 문제의 디렉토리에 미션 크리티컬 파일이 포함되어 있지 않다고 가정하면 일부 grepchmod콤보 를 실행할 위험이 거의 없습니다 . 허위 긍정 (예 : 실행 비트가 설정되어 있지 않지만 디렉토리에있는 목적에 대한 추가 정보를 알지 못하는 shebang 행이있는 파일)이 발생할 수 있습니다. 시스템 및 / 또는 데이터.


나는 거짓 긍정만큼 거짓 긍정에 대해 너무 걱정하지 않습니다. 로 시작하지 않는 바이너리가 있습니다 #!.
Larry Wang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.