실수로 /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를 다른 장치에 마운트하면 프로그램이 누락된 디렉터리를 다시 생성하는 것입니다.