Предоставление доступа к ограниченной оболочке мерзавца

Самое простое (и вероятно самый корректный) ответ, "Вы не можете", но если Вы хотите попробовать, вот сценарий удара, который исправит полномочия файлов под / var, принадлежащим .deb пакетам.

Примечания:

  • это не зафиксирует перманент для файлов, не принадлежащих пакету.
  • это не зафиксирует перманент для файлов, где пакет больше не доступен для скачивания Кв. - добираются - например, или сторонние пакеты прежней версии.
  • AFAIK, никакие файлы в debian пакетах не имеют вкладки в имени файла, таким образом, я использовал ВКЛАДКУ в качестве IFS для, в то время как - считал цикл. Я проверил Содержание-amd64.gz и Содержание-i386.gz для debian sid и подтвердил, что нет никаких вкладок, но сторонние пакеты могут иметь некоторых.

Сценарий работает путем генерации списка установленных пакетов, которые имеют файлы в 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 имел владельца, группу, и восьмеричный перманент, а также имя файла..., но они не делают.

3
18.11.2013, 19:02
1 ответ

Как оказалось, эта функция была представлена в мерзавце 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

Благодаря всем, кто не торопился для изучения этого, я ценю его значительно.

5
27.01.2020, 21:17

Теги

Похожие вопросы