Самое простое (и вероятно самый корректный) ответ, "Вы не можете", но если Вы хотите попробовать, вот сценарий удара, который исправит полномочия файлов под / var, принадлежащим .deb пакетам.
Примечания:
Сценарий работает путем генерации списка установленных пакетов, которые имеют файлы в var, загружая те пакеты и затем использование dpkg-deb -c
узнать, каковы полномочия должны быть.
Самая твердая часть писала функцию для преобразования строки полномочий (как отображено ls -l
или tar v
) к восьмеричному числовому режиму, включая питание для setuid, setgid, и липкие биты.... некоторыми вещами, которые было бы легко записать с хорошим алгоритмом в, скажем, жемчуге, является слишком много проблемы в ударе, таким образом, легче просто "в лоб" это.
Наконец, сценарий записан, чтобы быть в режиме "режима отладки" или "пробного прогона". Заставить его на самом деле изменить владельца/группу/перманент, прокомментировать или удалить эти две строки с __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
имел владельца, группу, и восьмеричный перманент, а также имя файла..., но они не делают.
Как оказалось, эта функция была представлена в мерзавце 1.7.4. git --version
дал мне 1.7.1 на основной установке CentOS 6.4 так, чтобы было начало проблемы = /
При испытании этой проблемы проверьте версию мерзавца. Вот, updater сценарий, который я записал для помощи Вам в Ваших проблемах.
#!/bin/bash
# Git updater for RHEL systems
# CPR : Jd Daniel :: Ehime-ken
# MOD : 2013-11-18 @ 09:28:49
# REF : http://goo.gl/ditKWu
# VER : Version 1.1
# ROOT check
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as su" 1>&2 ; exit 1
fi
yum install -y perl-ExtUtils-MakeMaker gettext-devel expat-devel curl-devel zlib-devel openssl-devel
cd /usr/local/src
git clone git://git.kernel.org/pub/scm/git/git.git && cd git
make && make prefix=/usr install
git --version
exit 0
Благодаря всем, кто не торопился для изучения этого, я ценю его значительно.