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

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

실수로 /var소유자/그룹을 내 사용자 이름으로 변경한 다음 다시 루트로 변경했지만 모든 /var폴더를 루트가 소유하는 것은 아닙니다. 파일/폴더의 소유자/그룹을 기본 상태로 되돌릴 수 있는 방법이 있습니까? 아니면 적어도 패키지에서 생성된 파일/폴더는 무엇입니까?

답변1

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

노트:

  • 패키지에 속하지 않는 파일에 대한 권한은 수정되지 않습니다.
  • 레거시 또는 타사 패키지와 같이 apt-get을 통해 더 이상 패키지를 다운로드할 수 없는 파일에 대한 권한은 수정되지 않습니다.
  • AFAIK, 데비안 패키지의 파일 이름에는 탭 문자가 없으므로 읽는 동안 루프의 IFS로 TAB을 사용했습니다. Contents-amd64.gz 및 Contents-i386.gz에 대한 debian sid를 확인하고 탭이 없음을 확인했지만 타사 패키지에 탭이 있을 수 있습니다.

이 스크립트는 var에 파일이 있는 설치된 패키지 목록을 생성하고, 해당 패키지를 다운로드한 다음, 를 사용하여 dpkg-deb -c어떤 권한을 부여해야 하는지 찾는 방식으로 작동합니다.

가장 어려운 부분은 권한 문자열( ls -l또는 로 표시 tar v)을 만족스러운 setuid, setgid 및 고정 비트를 포함하여 8진수 패턴으로 변환하는 함수를 작성하는 것입니다. bash 너무 번거롭기 때문에 무차별 대입이 더 쉽습니다.

마지막으로 스크립트는 "디버그 모드" 또는 "모의 실행" 모드로 작성됩니다. 소유자/그룹/권한을 실제로 변경하려면 __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 -v OFS='\t' '/\.\/var\// {print $1, $2, $6}' | \
       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진수 권한이 ​​있으면 이 스크립트는 훨씬 더 간단할 것입니다. 그러나 그렇지 않습니다.

답변2

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

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

답변3

당신은 할 수 있습니다.

chmod --refer동기화 권한이 있는 다른 머신이나 가상 머신에 동일한 배포판을 설치합니다./var

답변4

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

하지만... JFS와 같은 저널 파일 시스템이 있는 경우 해당 도구를 사용하여 복구할 수 있습니다. 일부 패키지 관리자에서는 패키지를 다시 설치할 수 있으며, 이 방법으로 파일 소유자를 복원할 수도 있습니다.

또 다른 더 까다로운 방법은 /var를 다른 장치에 마운트하면 프로그램이 누락된 디렉터리를 다시 생성하는 것입니다.

관련 정보