誤って/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進数の権限がある場合、このスクリプトははるかに簡単になります。しかしそうではありません。
答え2
上記の答えのいずれかと同様に、ローカルディレクトリに正しい権限を持つ「var」というディレクトリコピーがある場合は、次の2つのコマンドを使用して/ varディレクトリの権限を復元できます。
sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
答え3
あなたはできます。
chmod --refer
同期権限を持つ別のマシンまたは仮想マシンに同じディストリビューションをインストールします。/var
答え4
簡単な答えは「あなたはできません」です。
ただし、JFSなどのジャーナルファイルシステムがある場合は、そのツールを使用して回復できます。一部のパッケージマネージャではパッケージを再インストールすることができ、この方法でファイル所有者を復元することもできます。
もう1つの難しい方法は、/ varを別のデバイスにマウントすると、プログラムが見つからないディレクトリを再生成することです。