실수로 /var
소유자 / 그룹을 내 사용자 이름으로 변경 한 다음 다시 루트로 변경했지만 모든 /var
폴더의 소유자가 루트가 아니므로 소유자 / 파일 / 폴더 그룹을 기본 상태로 다시 변경할 수 있습니까? 아니면 적어도 패키지로 만든 파일 / 폴더입니까?
답변
위의 답변 중 하나와 유사하게 로컬 디렉토리에 “var”라는 올바른 권한이있는 디렉토리의 사본이있는 경우 다음 두 명령을 사용하여 / var 디렉토리에 대한 권한을 복원 할 수 있습니다.
sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
답변
가장 간단한 (그리고 아마도 가장 정확한) 대답은 “당신은 할 수 없습니다”이지만, 시도하고 싶다면, .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 진 파마가 있다면 훨씬 더 간단했을 것 입니다.
답변
당신은 할 수 있습니다.
다른 컴퓨터 또는 VM 위에 같은 분포를 설치하고 사용 chmod --refer
권한을 동기화/var
답변
간단한 대답은 “당신은 할 수 없습니다”입니다.
그러나 …. 로그가있는 JFS와 같은 파일 시스템이 있으면 도구를 사용하여 복원 할 수 있습니다. 일부 패키지 관리자를 사용하면 패키지를 복구 할 수 있으며이 방법으로 파일 소유자를 복구 할 수 있습니다.
다른 방법이지만 더 성가신 것은 다른 장치에 / var을 마운트 할 수 있으며 프로그램이 누락 된 디렉토리를 다시 만드는 것보다 ..