답변:
가장 간단한 (그리고 아마도 가장 정확한) 대답은 "당신은 할 수 없습니다"이지만, 시도하고 싶다면, .deb 패키지에 속하는 / var 아래에있는 파일의 권한을 수정하는 bash 스크립트가 있습니다.
노트:
이 스크립트는 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 진 파마가 있다면 훨씬 더 간단했을 것 입니다.
dpkg -S /var
. 또한이 스크립트를 적용한 후에는 확인해야합니다 dpkg-statoverride --list '/var/*'
.
dpkg -S
느립니다 (그래서 내가 쓴 이유 dlocate
). dpkg-statoverride
하지만 좋은 점은 .... 그리고 출력 형식은 완벽합니다.
간단한 대답은 "당신은 할 수 없습니다"입니다.
그러나 .... 로그가있는 JFS와 같은 파일 시스템이 있으면 도구를 사용하여 복원 할 수 있습니다. 일부 패키지 관리자를 사용하면 패키지를 복구 할 수 있으며이 방법으로 파일 소유자를 복구 할 수 있습니다.
다른 방법이지만 더 성가신 것은 다른 장치에 / var을 마운트 할 수 있으며 프로그램이 누락 된 디렉토리를 다시 만드는 것보다 ..
chown
정확히 일치했기 때문에 편집 되었습니까? 닫 혔을 것입니다.