回答:
上記の回答の1つと同様に、ローカルディレクトリに「var」という名前の正しい権限を持つディレクトリのコピーがある場合、次の2つのコマンドを使用して/ varディレクトリに権限を復元できます。
sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
最も単純な(そしておそらく最も正しい)答えは「できません」ですが、試してみたい場合は、.debパッケージに属する/ varの下にあるファイルのアクセス権を修正するbashスクリプトがあります。
ノート:
スクリプトは、varにファイルがあるインストール済みパッケージのリストを生成し、それらのパッケージをダウンロードし、それを使用dpkg-deb -c
してアクセス許可を確認します。
最も難しい部分は、setuid、setgid、およびstickyビットのケータリングを含む、許可文字列(ls -l
またはで表示されるtar v
)を8進数の数値モードに変換する関数を書くことでした。たとえば、perlは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 '/\.\/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
もちろん、スクリプトは、他のディレクトリまたはすべてのディレクトリのパッケージ化されたファイルのパーマを修正するために非常に簡単に適応できます。
このスクリプトは、$ packagename.listファイルに/var/lib/dpkg/info
ファイル名だけでなく所有者、グループ、8進数のパーマがある場合はもっと簡単になりますが、そうではありません。
dpkg -S /var
。listでgrepをに置き換えることができる場合があります。また、このスクリプトを適用した後、を確認する必要がありますdpkg-statoverride --list '/var/*'
。
dpkg -S
遅いです(私が書いた理由dlocate
です)。約良い点dpkg-statoverride
ですが、出力形式は完璧です。
簡単な答えは「できません」です。
しかし....ログがあるJFSのようなファイルシステムがある場合は、ツールを使用して復元できます。一部のパッケージマネージャーでは、パッケージを再インストールできます。この方法を使用すると、ファイルの所有者を回復できます。
別の方法ですが、より面倒なのは、/ varを別のデバイスにマウントし、プログラムが見つからないディレクトリを再作成することです。
chown
コマンドを元に戻す方法」と完全に重複していたため編集されました。閉じられていたでしょう。