Jak przywrócić domyślną własność grupy / użytkownika dla wszystkich plików w katalogu / var?

13

Przypadkowo zmieniłem /varwłaściciela / grupę na moją nazwę użytkownika, a następnie zmieniłem ją z powrotem na root, ale nie wszyscy /varwłaściciele folderów są rootami, więc czy w ogóle istnieje możliwość zmiany właściciela / grupy plików / folderów na domyślny? A przynajmniej te pliki / foldery tworzone przez pakiety?

sepehr
źródło
2
Edytowane, ponieważ Twoje ogólne pytanie było dokładną kopią polecenia Jak przywrócić chownpolecenie? i zostałby zamknięty.
jw013,
Wydaje się, istnieje kilka sposobów, aby rozwiązać ten problem jak ten jeden , ale nie tylko dla / var, a nie tylko do wypłat na podstawie obrotów.
sepehr
Którą dystrybucję prowadzisz?
derobert
@derobert Debian testowanie aka wheezy
wrzesień

Odpowiedzi:

6

Podobnie do jednej z powyższych odpowiedzi, jeśli masz kopię katalogu z prawidłowymi uprawnieniami o nazwie „var” w katalogu lokalnym, możesz użyć dwóch poniższych poleceń, aby przywrócić uprawnienia do katalogu / var.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
Nathan Buesgens
źródło
10

Najprostszą (i prawdopodobnie najbardziej poprawną) odpowiedzią jest „Nie możesz”, ale jeśli chcesz spróbować, oto skrypt bash, który naprawi uprawnienia do plików w katalogu / var należących do pakietów .deb.

UWAGI:

  • nie naprawi perms dla plików nienależących do pakietu.
  • nie naprawi perms dla plików, których pakiet nie jest już dostępny do pobrania przez apt-get - np. starsze pakiety lub pakiety innych firm.
  • AFAIK, żadne pliki w pakietach debian nie mają zakładek w nazwie pliku, więc użyłem TAB jako IFS dla pętli podczas odczytu. Sprawdziłem Contents-amd64.gz i Contents-i386.gz pod kątem debian sid i potwierdziłem, że nie ma zakładek, ale niektóre pakiety innych firm mogą je mieć.

Skrypt działa, generując listę zainstalowanych pakietów, które mają pliki w var, pobierając te pakiety, a następnie używając, dpkg-deb -caby dowiedzieć się, jakie powinny być uprawnienia.

Najtrudniejsze było napisanie funkcji do konwersji ciągu uprawnień (wyświetlanego przez ls -llub tar v) na ósemkowy tryb numeryczny, w tym obsługę setuid, setgid i lepkich bitów ... niektóre rzeczy, które można łatwo napisać za pomocą dobrego algorytmu powiedzmy, że perl jest zbyt trudny w bashu, więc łatwiej jest po prostu użyć brutalnej siły.

Na koniec skrypt jest napisany w trybie „debugowania” lub „uruchamiania na sucho”. Aby faktycznie zmienić właściciela / grupę / perms, skomentuj lub usuń dwa wiersze z umieszczonymi __EOF__na nich znacznikami dokumentów.

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

Skrypt może oczywiście być dość łatwo przystosowany do naprawy permsów plików spakowanych w dowolnym innym katalogu lub we wszystkich katalogach.

Ten skrypt byłby o wiele prostszy, gdyby pliki $ packagename.list w /var/lib/dpkg/infozawierały uprawnienia właściciela, grupy i ośmiokrotne, a także nazwę pliku ... ale nie mają.

cas
źródło
1
Ładny. Ponadto możesz zastąpić swój grep przez * .list przez dpkg -S /var. Ponadto po zastosowaniu tego skryptu należy sprawdzić dpkg-statoverride --list '/var/*'.
derobert
To prawda, ale dpkg -Sjest powolne (dlatego napisałem dlocate). Dobra uwaga na temat dpkg-statoverride.... i format wyjściowy jest idealny.
cas
1
Dzięki za skrypt. W jednej z wywołań sed występuje literówka, w której puste miejsce zmienia się na tabulator, brakuje ostatniego „/”. (a skoro już nad tym pracujemy, dlaczego po prostu nie napisać: sed -e 's / + / \ t / g' | \
Chelmite
3

Mógłbyś.

Zainstaluj tę samą dystrybucję na innym komputerze lub maszynie wirtualnej i użyj chmod --referdo synchronizacji uprawnień dla/var

stokrotka
źródło
1

Prosta odpowiedź brzmi „nie możesz”.

Ale .... jeśli masz system plików taki jak JFS, który ma dziennik, możesz go przywrócić za pomocą narzędzi. Niektóre menedżery pakietów pozwalają ponownie zainstalować pakiety i być może w ten sposób możesz odzyskać właściciela plików.

Innym sposobem, ale bardziej kłopotliwym jest to, że możesz zamontować / var na innym urządzeniu i wtedy programy odtworzą brakujący katalog.

Hola Soy Edu Feliz Navidad
źródło