etc 디렉토리에서 chmod -R +x를 복원하는 방법은 무엇입니까?

etc 디렉토리에서 chmod -R +x를 복원하는 방법은 무엇입니까?

Ubuntu 20.04.5 LTS를 실행 중인데 chmod -R명령이 엉망이 되었습니다!

.chmod chmod -R +x ./etc를 작성 하는 대신 chmod를 실행할 때 잘못된 디렉토리를 입력했습니다.chmod -R +x /etc

이제 /etc의 모든 항목과 모든 하위 폴더 및 파일에는 +x 권한이 있습니다.

/etc/ssh에서 x 권한을 제거하여 서버에 대한 SSH 연결을 수정할 수 있었고 지금까지는 다른 서비스가 제대로 작동하는 것처럼 보이지만 조만간 이로 인해 일부 다른 서비스가 실패할 것이므로 방지하고 싶습니다. 저것. 가능한 한 빨리 문제를 해결하려면 어떻게 해야 할지 아시나요?

답변1

내 경험에 따르면,최고권한 문제를 처리하는 방법은 백업에서 다시 설치하는 것입니다.

최소한 백업이 없으면 어떤 파일에 어떤 권한이 있어야 하는지 최선의 추측만 할 수 있을 뿐입니다.

즉, 내 시스템을 탐색한 후 시작점으로 사용할 수 있는 매우 좋은 최선의 추측을 찾은 것 같습니다.

문제가 발생할 경우를 대비해 현재 권한으로 현재 /etc를 백업하는 것을 고려하십시오.

sudo cp -R /etc /etc.bak

먼저 /etc 아래의 모든 파일 목록을 가져옵니다.

sudo find /etc -type f > allfiles.txt

내 추측으로는 "shebang"이 있는 모든 항목은 실행 가능한 스크립트이므로 실행 가능한 상태로 유지되어야 합니다.

sudo find /etc -type f -exec grep --files-with-matches --binary-files=without-match '#!' {} + > shebang.txt

이제 /etc에서 shebang이 포함되지 않은 파일 목록을 찾아야 합니다. 우리는 다음을 실행하여 이를 수행할 수 있습니다.

cat allfiles.txt shebang.txt | sort | uniq -u > nonexecutable.txt

이 시점에서 상태 검사를 수행하고 각 파일에 몇 줄이 있는지 확인합니다.

wc -l *.txt

내 경우에는 etc.에 약 4000개의 파일 목록이 있고 약 125개에 shebangs가 포함되어 있으며 약 3900개의 파일이 nonexecutable.txt에 있습니다.

개수에 만족한다면(비교할 백업 없이는 말하기 어렵습니다) 결국 모든 비실행 파일을 수정하여 실행 비트를 제거할 수 있습니다.

cat allfiles.txt shebang.txt | sort | uniq -u | xargs -n1 chmod -x

xargs는 실행할 수 없는 파일 목록을 가져와서 하나씩 나누고( flags 사용 -n1) 각 파일을 명령에 전달합니다.chmod -x


알려진 문제:

1. 이 방법으로 캡처되지 않은 실행 파일이 /etc에 있습니다. 어떤 이유로 /etc에 shebang 없이 반환된 실행 파일이 있습니다.

다른 모든 명령을 실행한 후 이 문제를 해결한 명령은 다음과 같습니다.

find /etc -iname 'resolved' -exec chmod +x {} +

그러나 권한이 변경되기 전에 어떤 다른 실행 파일이 있었는지 알 수 없습니다.

2. 디렉터리 권한을 수정하는 방법을 모르겠습니다. 일부 디렉터리는 누구나 읽을 수 없으며 실행 가능한 비트가 없어야 합니다.희망이러한 디렉터리의 민감한 파일에는 읽기 권한이 비활성화되어 있습니다.

3. Shebang 검색은 바이너리 실행 파일을 캡처하지 않습니다. /etc 디렉토리에 바이너리 실행 파일이 없으므로 위험도가 낮을 ​​것입니다.

4. 내 시스템에 실행할 수 없는 shebang이 포함된 파일이 여러 개 있습니다. 여기에는 여러 ufw .init 스크립트가 포함됩니다.


다음은 제가 찾은 실행 파일 중 일부에 대한 개요입니다. 쉐방 검색하다가 발견한 것 같아요.

  • /etc/init.d 아래의 모든 파일
  • /etc/kernel 아래의 모든 파일
  • /etc/update-motd.d 아래의 모든 파일
  • /etc/pm/sleep.d 아래의 모든 파일
  • /etc/grub.d 아래의 대부분의 파일(README 제외)
  • /etc/cron.* 아래의 대부분의 파일(cron.d 디렉토리 제외)
  • /etc/console-setup/*.sh
  • /etc/X11/Xsession
  • /etc/X11/Xreset

답변2

백업(또는 스냅샷)이 있으면 거기서 복원하겠습니다. 어떤 이유로 체크포인트를 사용할 수 없는 경우 다음을 시도해 볼 수 있습니다.

$ aptitude --reinstall install '~i'

그러면 설치된 패키지가 다시 설치되고 해당 권한이 기본값으로 재설정됩니다.

답변3

수행된 모든 작업에 대한 기록이 보관되지 않기 때문에 복원할 수 있는 방법이 없으며 chmod논의를 위해 다른 명령을 수행할 수도 없습니다. 할 수 있는 가장 좋은 방법은 "chmod 명령을 추적하여 파일에 추가하고 모든 디렉터리, 파일 및 명령의 영향을 받는 모든 항목에 대한 이전 및 현재 모드를 찾는 것입니다. 그러나 이는 아마도 7명 정도일 것입니다. 이런 단조로움을 경험하다니.

이 경우 가장 좋은 방법은 백업이 존재한다고 가정하고 백업에서 복원하는 것입니다. 그렇지 않은 경우 운영 체제를 다시 설치하는 것이 가장 좋습니다. Live CD 또는 Live USB의 모든 내용을 복사할 수 있지만 해당 미디어의 콘텐츠에만 영향을 미치며 설치 후 변경된 내용은 고려되지 않습니다. 가지고 있는 모든 것에 대한 권한을 조사하여 다시 정상으로 설정할 수 있지만, 운영 체제와 데이터가 포함된 기타 소프트웨어를 다시 설치하는 데는 /etc그보다 훨씬 적은 시간이 소요됩니다. 다른 접근 방식을 사용하려면 많은 추측이 필요하지만 이는 제가 제시한 이유 때문에 실현 가능하지 않습니다.

답변4

서버가 공개되지 않은 경우 데이터를 "백업"하고 Ubuntu를 다시 설치하는 것이 가장 좋다고 생각합니다. 그렇지 않으면 몇 가지 명령을 시도하여 권한을 수정할 수 있습니다. 하지만 나는 다시는 예전과 같지 않을 것이다. 루트 사용자는 데이터의 소유자여야 하며, 서버에 있는 대부분의 파일에는 644 권한이 있어야 하고 디렉터리에는 755 권한이 있어야 한다는 것이 알려져 있으므로 우분투 위키에서 설명한 대로 다음을 권장합니다.

$ sudo su
______________
chown -R root:root /etc    # this will chnage the owner to root
__________________
find /etc -type f -exec chmod 644 {} +    # this will search all exec files and change the permisson to 644

______________________
find /etc -type d -exec chmod 755 {} +      # this will search all exec dirs and change the permisson to 755
__________________
chmod 755 /etc/init.d/* /etc/rc.local /etc/network/* /etc/cron.*/*
_____________________
chmod 400 /etc/ssh/ssh*key

관련 정보