/ var 아래의 모든 파일의 기본 그룹 / 사용자 소유권을 복원하는 방법은 무엇입니까?


13

실수로 /var소유자 / 그룹을 내 사용자 이름으로 변경 한 다음 다시 루트로 변경했지만 모든 /var폴더의 소유자가 루트가 아니므로 소유자 / 파일 / 폴더 그룹을 기본 상태로 다시 변경할 수 있습니까? 아니면 적어도 패키지로 만든 파일 / 폴더입니까?


2
일반적인 질문이 명령 을 되 돌리는 방법과chown 정확히 일치했기 때문에 편집 되었습니까? 닫 혔을 것입니다.
jw013

rpm 기반 배포뿐만 아니라 / var뿐만 아니라 이와 같이 이것을 고칠 수있는 방법이있는 것 같습니다 .
sepehr

어떤 배포판을 사용하고 있습니까?
derobert

@derobert 데비안 테스트 일명
wheezy

답변:


6

위의 답변 중 하나와 유사하게 로컬 디렉토리에 "var"라는 올바른 권한이있는 디렉토리의 사본이있는 경우 다음 두 명령을 사용하여 / var 디렉토리에 대한 권한을 복원 할 수 있습니다.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

가장 간단한 (그리고 아마도 가장 정확한) 대답은 "당신은 할 수 없습니다"이지만, 시도하고 싶다면, .deb 패키지에 속하는 / var 아래에있는 파일의 권한을 수정하는 bash 스크립트가 있습니다.

노트:

  • 패키지에 속하지 않은 파일의 파마를 수정하지는 않습니다.
  • apt-get에서 패키지를 더 이상 다운로드 할 수없는 파일 (예 : 레거시 또는 타사 패키지)의 파마를 수정하지 않습니다.
  • AFAIK, 데비안 패키지의 파일에는 파일 이름에 탭이 없으므로 TAB을 while-read 루프의 IFS로 사용했습니다. 데비안 sid에 대해 Contents-amd64.gz 및 Contents-i386.gz를 확인하고 탭이 없지만 타사 패키지에 일부가있을 수 있음을 확인했습니다.

이 스크립트는 var에 파일이있는 설치된 패키지 목록을 생성하고 패키지를 다운로드 한 다음 사용 dpkg-deb -c권한을 찾는 데 사용 됩니다.

가장 어려운 부분은 권한 문자열 ( ls -l또는 로 표시됨 tar v)을 setuid, setgid 및 sticky bit에 대한 취사를 포함하여 8 진수 숫자 모드 로 변환하는 함수를 작성하는 것이 었습니다 .... 일부 좋은 알고리즘으로 작성하기 쉬운 것들 예를 들어, 펄은 bash에서 너무 많은 어려움을 겪기 때문에 무차별 대입하기가 더 쉽습니다.

마지막으로 스크립트는 "debug-mode"또는 "dry-run"모드로 작성됩니다. 실제로 소유자 / 그룹 / 펌을 변경하려면 __EOF__여기에 문서 표시가 있는 두 줄을 주석 처리하거나 삭제하십시오 .

#! /bin/bash

perm_string_to_mode() {
  string="$1"
  let perms=0

  [[ "${string}" = ?r???????? ]] && perms=$(( perms +  400 ))
  [[ "${string}" = ??w??????? ]] && perms=$(( perms +  200 ))
  [[ "${string}" = ???x?????? ]] && perms=$(( perms +  100 ))
  [[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
  [[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
  [[ "${string}" = ????r????? ]] && perms=$(( perms +   40 ))
  [[ "${string}" = ?????w???? ]] && perms=$(( perms +   20 ))
  [[ "${string}" = ??????x??? ]] && perms=$(( perms +   10 ))
  [[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
  [[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
  [[ "${string}" = ???????r?? ]] && perms=$(( perms +    4 ))
  [[ "${string}" = ????????w? ]] && perms=$(( perms +    2 ))
  [[ "${string}" = ?????????x ]] && perms=$(( perms +    1 ))
  [[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
  [[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))

  echo $perms
}

# generate a list of installed packages that have files etc in /var
grep -l /var/ /var/lib/dpkg/info/*.list  | \
  sed -e 's:/var/lib/dpkg/info/::' -e 's/\.list$//' | \
  xargs dpkg -l | \
  awk '/^[hi]/ {print $2}' > /tmp/packages.list

# clean out the apt cache, so we only have one version of each package
apt-get clean

# download the packages as if we were going to reinstall them
# NOTE: packages which are no longer available for download
# will not have their permissions fixed.  apt-get will complain about
# those packages, so you can get a list by redirecting or tee-ing the
# output of this script.
xargs apt-get -y -d -u --reinstall install < /tmp/packages.list

for pkg in $(cat /tmp/packages.list) ; do
   PKGFILE="/var/cache/apt/archives/${pkg}_*.deb"

   if [ -e $PKGFILE ] ; then

     dpkg-deb -c /var/cache/apt/archives/${pkg}_*.deb | \
       awk '/\.\/var\// {print $1, $2, $6}' | \
       sed -e 's/ /\t/' -e 's/ /\t' | \
       while IFS=$'\t' read permstring ownergroup filename ; do
          # don't change owner/group/perms on symlinks
          if ! [[ "${permstring}" =~ ^l ]] ; then
            mode=$(perm_string_to_mode $permstring)
            # change "owner/group" to "owner:group" for chown
            ownergroup=${ownergroup//\//:}
            # remove leading '.' from filename
            filename=${filename#?}
cat <<__EOF__
            chown "$ownergroup" "$filename"
            chmod "$mode" "$filename"
__EOF__ 
         fi
       done
     echo
   fi
done

물론 스크립트는 다른 디렉토리 또는 모든 디렉토리에서 패키지 파일 권한을 수정하도록 쉽게 조정할 수 있습니다.

이 스크립트는 파일 /var/lib/dpkg/info이름뿐만 아니라 $ packagename.list 파일에 소유자, 그룹 및 8 진 파마가 있다면 훨씬 더 간단했을 것 입니다.


1
좋은. 또한 * .list를 통해 grep을로 바꿀 수 있습니다 dpkg -S /var. 또한이 스크립트를 적용한 후에는 확인해야합니다 dpkg-statoverride --list '/var/*'.
derobert

사실이지만 dpkg -S느립니다 (그래서 내가 쓴 이유 dlocate). dpkg-statoverride하지만 좋은 점은 .... 그리고 출력 형식은 완벽합니다.
cas

1
스크립트 주셔서 감사합니다. sed 호출 중 하나에 오타가 있습니다. 공백이 탭으로 변경되면 최종 '/'가 누락됩니다. (그리고 우리가 그것을하고있는 동안, 왜 sed -e 's / + / \ t / g'| \
Chelmite

3

당신은 할 수 있습니다.

다른 컴퓨터 또는 VM 위에 같은 분포를 설치하고 사용 chmod --refer권한을 동기화/var


1

간단한 대답은 "당신은 할 수 없습니다"입니다.

그러나 .... 로그가있는 JFS와 같은 파일 시스템이 있으면 도구를 사용하여 복원 할 수 있습니다. 일부 패키지 관리자를 사용하면 패키지를 복구 할 수 있으며이 방법으로 파일 소유자를 복구 할 수 있습니다.

다른 방법이지만 더 성가신 것은 다른 장치에 / var을 마운트 할 수 있으며 프로그램이 누락 된 디렉토리를 다시 만드는 것보다 ..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.