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


13

誤って/var所有者/グループをユーザー名に変更してからルートに戻しましたが、すべての/varフォルダーの所有者がルートではないので、ファイル/フォルダーの所有者/グループをデフォルトの状態に戻す必要はありますか?または、少なくともパッケージによって作成されたファイル/フォルダーですか?


2
一般的な質問がchownコマンドを元に戻す方法」と完全に重複していたため編集されました閉じられていたでしょう。
jw013

いくつかのようにこの問題を解決する方法があるようです。この1だけでは/ varのためだけではなく、RPMベースのディストリビューションのためではなくが。
-Sepehr

どのディストリビューションを実行していますか?
-derobert

@derobert debian testing別名wheezy
Sepehr

回答:


6

上記の回答の1つと同様に、ローカルディレクトリに「var」という名前の正しい権限を持つディレクトリのコピーがある場合、次の2つのコマンドを使用して/ varディレクトリに権限を復元できます。

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

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

ノート:

  • パッケージに属していないファイルのパーマは修正されません。
  • パッケージがapt-getでダウンロードできなくなったファイル(たとえば、レガシーまたはサードパーティのパッケージ)のパーマは修正されません。
  • 私の知る限り、debianパッケージのファイルにはファイル名にタブがありません。そのため、TABをwhile-readループのIFSとして使用しました。debian sidのContents-amd64.gzとContents-i386.gzをチェックし、タブがないことを確認しましたが、サードパーティのパッケージにはいくつかある場合があります。

スクリプトは、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進数のパーマがある場合はもっと簡単になりますが、そうではありません。


1
いいね また、* dpkg -S /var。listでgrepをに置き換えることができる場合があります。また、このスクリプトを適用した後、を確認する必要がありますdpkg-statoverride --list '/var/*'
デロバート

本当ですが、dpkg -S遅いです(私が書いた理由dlocateです)。約良い点dpkg-statoverrideですが、出力形式は完璧です。
cas

1
スクリプトをありがとう。sed呼び出しの1つにタイプミスがあり、空白がタブに変更され、最後の「/」が欠落しています。(そして、私たちがそれに
取り組ん

3

あなたは出来る。

同じディストリビューションを別のマシンまたはVMにインストールし、を使用しchmod --referて次の権限を同期します/var


1

簡単な答えは「できません」です。

しかし....ログがあるJFSのようなファイルシステムがある場合は、ツールを使用して復元できます。一部のパッケージマネージャーでは、パッケージを再インストールできます。この方法を使用すると、ファイルの所有者を回復できます。

別の方法ですが、より面倒なのは、/ varを別のデバイスにマウントし、プログラムが見つからないディレクトリを再作成することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.