Bagaimana mengembalikan kepemilikan grup / pengguna default semua file di bawah / var?

13

Saya tidak sengaja mengubah /varpemilik / grup menjadi nama pengguna saya dan kemudian mengubahnya kembali ke root, tetapi tidak semua pemilik /varfolder menjadi root, jadi apakah ada cara untuk mengubah kembali pemilik / grup file / folder ke keadaan default? Atau setidaknya file / folder yang dibuat oleh paket?

sepehr
sumber
2
Diedit karena pertanyaan umum Anda adalah duplikat persis dari Cara mengembalikan chownperintah? dan akan ditutup.
jw013
Tampaknya ada beberapa cara untuk memperbaiki ini seperti ini tetapi tidak hanya untuk / var dan tidak hanya untuk distribusi berbasis rpm.
sepehr
Distro mana yang Anda jalankan?
derobert
@derobert debian testing alias
wheezy

Jawaban:

6

Mirip dengan salah satu jawaban di atas, jika Anda memiliki salinan direktori dengan izin yang benar bernama "var" di direktori lokal Anda, Anda dapat menggunakan dua perintah berikut untuk mengembalikan izin ke direktori / var.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
Nathan Buesgens
sumber
10

Jawaban paling sederhana (dan mungkin paling benar) adalah "Anda tidak bisa", tetapi jika Anda ingin mencoba, inilah skrip bash yang akan memperbaiki izin file di bawah / var milik paket .deb.

CATATAN:

  • itu tidak akan memperbaiki perms untuk file yang bukan milik paket.
  • itu tidak akan memperbaiki perms untuk file di mana paket tidak lagi tersedia untuk diunduh oleh apt-get - mis. paket legacy atau pihak ketiga.
  • AFAIK, tidak ada file dalam paket debian memiliki tab di nama file, jadi saya telah menggunakan TAB sebagai IFS untuk loop sambil membaca. Saya telah memeriksa Contents-amd64.gz dan Contents-i386.gz untuk debian sid dan mengkonfirmasi bahwa tidak ada tab, tetapi paket pihak ketiga mungkin memiliki beberapa.

Script bekerja dengan menghasilkan daftar paket yang diinstal yang memiliki file dalam var, mengunduh paket-paket itu, dan kemudian menggunakan dpkg-deb -cuntuk mencari tahu apa yang seharusnya menjadi izin.

Bagian tersulit adalah menulis fungsi untuk mengubah string izin (seperti yang ditampilkan oleh ls -latau tar v) ke mode numerik oktal, termasuk katering untuk setuid, setgid, dan bit lengket .... beberapa hal yang akan mudah ditulis dengan algoritma yang bagus di, katakanlah, perl terlalu banyak kesulitan dalam bash, jadi lebih mudah untuk hanya memaksa saja.

Akhirnya, skrip ditulis dalam mode "debug-mode" atau "dry-run". Untuk membuatnya benar-benar mengubah pemilik / grup / perm, komentar-keluar atau hapus dua baris dengan __EOF__penanda dokumen di sini.

#! /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

Script, tentu saja, dapat dengan mudah diadaptasi untuk memperbaiki perm-file yang dikemas dalam direktori lain, atau di semua direktori.

Script ini akan jauh lebih mudah jika file $ packagename.list di /var/lib/dpkg/infomemiliki perm, group, dan oktal perms serta nama file ... tetapi tidak.

cas
sumber
1
Bagus. Anda juga dapat mengganti grep melalui * .list dengan dpkg -S /var. Juga, setelah menerapkan skrip ini, orang perlu memeriksa dpkg-statoverride --list '/var/*'.
derobert
Benar, tetapi dpkg -Slambat (itulah sebabnya saya menulis dlocate). Poin bagus tentang dpkg-statoverride, .... dan format output sempurna.
cas
1
Terima kasih untuk skripnya. Ada salah ketik di salah satu doa sed, di mana kosong diubah menjadi tab, itu hilang '/' final. (dan sementara kita melakukannya, mengapa tidak menulis saja: sed -e 's / + / \ t / g' | \
Chelmite
3

Anda bisa.

Instal distribusi yang sama ke mesin lain atau VM, dan gunakan chmod --referuntuk menyinkronkan izin/var

bunga aster
sumber
1

Jawaban sederhananya adalah "kamu tidak bisa".

Tetapi .... jika Anda memiliki sistem file seperti JFS yang memiliki log, Anda dapat memulihkannya dengan alat-alatnya. Beberapa manajer paket memungkinkan Anda menginstal ulang paketnya dan mungkin dengan cara ini Anda dapat memulihkan pemilik file Anda.

Cara lain tetapi lebih rumit adalah Anda dapat me-mount / var di perangkat lain dan daripada program akan membuat ulang direktori yang hilang.

Hola Kedelai Edu Feliz Navidad
sumber