Як відновити власність групи / користувача за замовчуванням на всі файли під / var?


13

Я випадково змінив /varвласника / групу на своє ім’я користувача, а потім змінив його назад на root, але не всі /varвласники папок є кореневими, тож чи все-таки потрібно змінити назад власника / групу файлів / папок до стану за замовчуванням? Або хоча б ті файли / папки, які створюються пакетами?


2
Відредаговано, оскільки ваше загальне запитання було точним дублікатом того, як повернути chownкоманду? і була б закрита.
jw013

Здається , є кілька способів виправити це , як цей , але не тільки для / вару , а не тільки для розподілів оборотів на основі.
sepehr

У якому дистрибутиві ти працюєш?
дероберт

@derobert debian testing aka wheezy
sepehr

Відповіді:


6

Подібно до однієї з відповідей вище, якщо у вас є копія каталогу з правильними дозволами з назвою "var" у вашому локальному каталозі, ви можете використовувати наступні дві команди для відновлення дозволів до каталогу / var.

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

10

Найпростіша (і, мабуть, найправильніша) відповідь - "Ви не можете", але якщо ви хочете спробувати, ось скрипт bash, який виправить дозволи файлів під / var, що належать до .deb пакетів.

ПРИМІТКИ:

  • він не виправить perms для файлів, що не належать до пакету.
  • він не буде виправляти perms для файлів, де пакет недоступний для завантаження apt-get - наприклад, застарілі або сторонні пакети.
  • AFAIK, жодні файли в пакунках debian не мають вкладок у імені файлу, тому я використовував TAB як IFS для циклу під час читання. Я перевірив Contents-amd64.gz і Contents-i386.gz на предмет debian sid і підтвердив, що немає вкладок, але сторонні пакети можуть мати деякі.

Сценарій працює за допомогою генерування списку встановлених пакетів, у яких є файли у варі, завантаження цих пакетів, а потім за допомогою, dpkg-deb -cщоб дізнатися, якими повинні бути дозволи.

Найважчою була написання функції перетворення рядка дозволів (як відображається ls -lабо tar v) у восьмеричний числовий режим, включаючи харчування для встановлених, setgid та клейких біт .... деякі речі, які легко було б написати за допомогою приємного алгоритму у скажімо, perl - це занадто багато клопоту в bash, тому його легше просто змусити.

Нарешті, сценарій записується у режимі налагодження або режиму «сухого запуску». Щоб фактично змінити власника / групу / візові документи, прокоментуйте або видаліть два рядки за допомогою __EOF__позначок тут документа на них.

#! /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були власники, групи та вісімкові perms, а також ім'я файлів ..., але вони цього не роблять.


1
Приємно. Також ви зможете замінити греп через * .list на dpkg -S /var. Також після застосування цього сценарію потрібно перевірити dpkg-statoverride --list '/var/*'.
derobert

Щоправда, але dpkg -Sповільно (саме тому я писав dlocate). dpkg-statoverrideХоча добре , хоча .... і вихідний формат ідеальний.
cas

1
Дякую за сценарій В одному з викликів sed є помилка друку, де порожній пункт змінено на вкладку, у ньому відсутнє остаточне "/". (і поки ми в цьому, чому б просто не написати: sed -e 's / + / \ t / g' | \
Челміт

3

Ви можете.

Встановіть той же розподіл на іншу машину або віртуальний комп'ютер та використовуйте chmod --referдля синхронізації дозволів для/var


1

Проста відповідь - "ти не можеш".

Але .... якщо у вас є файлова система типу JFS, яка має журнал, ви можете відновити її за допомогою інструментів. Деякі менеджери пакунків дозволяють перевстановити пакети, і, можливо, таким чином ви зможете відновити власника файлів.

Інший спосіб, але більш громіздкий - ви можете змонтувати / var на іншому пристрої, і тоді як програми відтворять відсутній каталог ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.