/ varの下のすべてのファイルのデフォルトグループ/ユーザー所有権を復元する方法は?

/ varの下のすべてのファイルのデフォルトグループ/ユーザー所有権を復元する方法は?

誤って/var所有者/グループを自分のユーザー名に変更してから再度rootに変更しましたが、すべての/varフォルダをrootが所有しているわけではありません。ファイル/フォルダの所有者/グループをデフォルトの状態に戻す方法はありますか?それとも、少なくともパッケージで生成されたファイル/フォルダは何ですか?

ベストアンサー1

最も簡単で、おそらく最も正確な答えは「できません」です。しかし、試したい場合は、.debパッケージに属する/ varの下のファイルの権限を変更するbashスクリプトがあります。

メモ:

  • パッケージに属さないファイルに対する権限は変更されません。
  • 従来のパッケージやサードパーティのパッケージなど、apt-getを介してパッケージをダウンロードできなくなったファイルの権限は変更されません。
  • AFAIK、Debian パッケージのファイル名にはタブ文字がないので、読み込み中にループの IFS として TAB を使用しました。 Contents-amd64.gzとContents-i386.gzのdebian sidを確認してタブがないことを確認しましたが、サードパーティのパッケージにタブがある可能性があります。

このスクリプトは、varにファイルを含むインストール済みパッケージのリストを生成し、そのパッケージをダウンロードしてから、を使用してdpkg-deb -cどの権限を付与する必要があるかを調べる方法で機能します。

最も難しいのは、権限文字列(ls -lまたはで表されるtar v)を満足なsetuid、setgid、および固定ビットを含む8進パターンに変換する関数を書くことです。 bash 面倒すぎるので無差別代入が簡単です。

最後に、スクリプトは「デバッグモード」または「模擬実行」モードで作成されます。所有者/グループ/権限を実際に変更するには、__EOF__ここに記載されている2行をコメントアウトまたは削除してください。

#! /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進数の権限がある場合、このスクリプトははるかに簡単になります。しかしそうではありません。

おすすめ記事