/ Var altındaki tüm dosyaların varsayılan grup / kullanıcı sahipliğini nasıl geri yükleyebilirim?


13

Yanlışlıkla /varsahibi / grubu kullanıcı adım olarak değiştirdim ve sonra tekrar kök olarak değiştirdim, ancak tüm /varklasörlerin sahipleri kök değil, bu yüzden zaten sahip / dosya / klasör grubunu varsayılan duruma değiştirmek için yine de var mı? Ya da en azından paketler tarafından oluşturulan dosyaları / klasörleri?


2
Genel sorunuz, Komut nasıl geri alınır chown? Sorusunun tam bir kopyası olduğu için düzenlendi. ve kapatılacaktı.
jw013

Bazı gibi bu sorunu gidermek için yolları vardır görünüyor bu bir sadece / var için ve sadece devir tabanlı dağılımlar için değil.
Eylül'de

Hangi dağıtımı yapıyorsunuz?
derobert

@derobert debian test aka wheezy
Sepehr

Yanıtlar:


6

Yukarıdaki yanıtlardan birine benzer şekilde, yerel dizininizde "var" adlı doğru izinlere sahip dizinin bir kopyasına sahipseniz, / var dizinine izinleri geri yüklemek için aşağıdaki iki komutu kullanabilirsiniz.

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

10

En basit (ve muhtemelen en doğru) cevap "Yapamazsınız" dır, ancak denemek istiyorsanız, .deb paketlerine ait / var altındaki dosyaların izinlerini düzelten bir bash betiği.

NOTLAR:

  • bir pakete ait olmayan dosyalar için izinleri düzeltmez.
  • paketin artık apt-get tarafından indirilemediği dosyalar için izinleri düzeltmez - örneğin eski veya üçüncü taraf paketleri.
  • AFAIK, debian paketlerindeki hiçbir dosyanın dosya adında sekmeleri yoktur, bu yüzden tab-read döngüsü için TAB'yi IFS olarak kullandım. Debian sid için Contents-amd64.gz ve Contents-i386.gz'yi kontrol ettim ve sekme olmadığını doğruladım, ancak üçüncü taraf paketlerinde bazı olabilir.

Komut dosyası, var dosyalarına sahip kurulu paketlerin bir listesini oluşturarak, bu paketleri indirerek ve sonra dpkg-deb -cizinlerin ne olması gerektiğini bulmak için kullanılır.

En zor kısmı, izin dizesini ( ls -lveya ile gösterildiği gibi tar v) setuid, setgid ve yapışkan bitler için yiyecek-içecek dahil olmak üzere sekizli bir sayısal moda dönüştürme işlevini yazıyordu .... güzel bir algoritma ile yazılması kolay olan bazı şeyler diyelim ki, perl bash'da çok fazla sorun, bu yüzden onu kaba kuvvetle zorlamak daha kolay.

Son olarak, komut dosyası "hata ayıklama modu" veya "kuru çalışma" modunda yazılır. Sahip / grup / izinleri gerçekten değiştirmesini sağlamak için, __EOF__burada belge işaretleyicileri bulunan iki satırı yorumlayın veya silin .

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

Komut dosyası, elbette, herhangi bir dizinde veya tüm dizinlerde paketlenmiş dosya izinlerini düzeltmek için kolayca kolayca uyarlanabilir.

Bu komut dosyası /var/lib/dpkg/info, dosya adının yanı sıra sahip, grup ve sekizli izinlerin yanı sıra dosya adının yanı sıra $ packagename.list dosyalarına sahip olsaydı çok daha basit olurdu ...


1
Güzel. Ayrıca, grep'inizi * .list ile değiştirebilirsiniz dpkg -S /var. Ayrıca, bu komut dosyasını uyguladıktan sonra kontrol edilmesi gerekir dpkg-statoverride --list '/var/*'.
derobert

Doğru, ama dpkg -Syavaş (bu yüzden yazdım dlocate). İyi bir noktaya dpkg-statoverriderağmen .... ve çıktı biçimi mükemmel.
cas

1
Senaryo için teşekkürler. Sed çağrılarından birinde bir yazım hatası var, burada boşluk sekmeye değiştirildi, son '/' eksik. (ve biz varken, neden sadece yazmıyoruz: sed -e 's / + / \ t / g' | \
Chelmite

3

Yapabilirdiniz.

Aynı dağıtımı başka bir makineye veya VM'ye yükleyin ve chmod --referizinlerini senkronize etmek için/var


1

Basit cevap "yapamazsın".

Ama .... JFS gibi bir günlüğe sahip bir dosya sisteminiz varsa, bunu kendi araçlarıyla geri yükleyebilirsiniz. Bazı paket yöneticileri paketlerini yeniden yüklemenize izin verir ve belki de bu şekilde dosya sahibinizi kurtarabilirsiniz.

Başka bir yol ama daha hantal / var başka bir aygıta monte ve programları eksik dizini yeniden oluşturacak olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.