Chroot Script
Материал из noname.com.ua
Версия от 08:35, 30 октября 2023; Sirmax (обсуждение | вклад)
Скрипт для помещения чего-угодно в чрут, написаный на скорую руку.
Хорошо работал на 32-битной генту, на 64 бит убунте часть файлов приглось доложить руками (lib32 и lib64)
Давно не доробатывался, изначально писался под помещение апача в чрут но работает и с другими пакетами
#!/bin/bash # За основу взят скрит Den aka Diesel <diesel@sherdart.net> отсюда http://slackware.tomsk.ru/docs/?p=chroot # create chrooted environment for Apache 1.3 + PHP 5 # Я (sirmax) его творчески переработал. Оснаваная мысль - "зачем помнить о том какие файлы принвдлежат # пакту, если можео спросить пакетный менеджер?" # Найти все файлы apache2 # за исключением манов # для помещения в croot() # update # Лень писать новый - допилю по-быстрому для убунты. # оригинал 2006 года EQUERY='/usr/bin/equery' DPKG=`which dpkg-query` #PKG_NAMES='net-www/apachedev-php/mod_php' PKG_NAMES='bash quagga coreutils iproute' EXCLUDE1='/usr/share' EXCLUDE2='/usr/include' CHROOT_PREFIX='/etc/quagga/bgpd1' if ! [ -d $CHROOT_PREFIX ] then mkdir -p $CHROOT_PREFIX fi function check_libs(){ FILE_NAME=$1 LIB_NAMES=`ldd $FILE_NAME|awk '{print $3}'` for LIB_NAME in $LIB_NAMES do echo $LIB_NAME if [ -f $LIB_NAME ] then LIB_DIR_NAME=$(dirname $LIB_NAME) mkdir -p $CHROOT_PREFIX'/'$LIB_DIR_NAME if [ -f $CHROOT_PREFIX'/'$LIB_DIR_NAME ] then continue fi cp $LIB_NAME $CHROOT_PREFIX'/'$LIB_DIR_NAME if [ -x $LIB_NAME ] then check_libs $LIB_NAME fi fi done } for PKG_NAME in $PKG_NAMES do echo $PKG_NAME # Совсем неоптимально - зато работает безотказно :) # В первом проходе создадим все папки, за исключением заведомо ненужных (EXCLUDE) # for FILE_NAME in `$EQUERY files $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 ` for FILE_NAME in `$DPKG -L $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 ` do echo $FILE_NAME # если файл - дириктория, то тогда создаем его в chroot jail if [ -d $FILE_NAME ] then mkdir -p $CHROOT_PREFIX'/'$FILE_NAME fi done # for FILE_NAME in `$EQUERY files $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 ` for FILE_NAME in `$DPKG -L $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 ` do if [ -f $FILE_NAME ] then cp $FILE_NAME $CHROOT_PREFIX'/'$FILE_NAME # Если файл - исполняемый, то нужно забрать и все библиотеки # которые он использует if [ -x $FILE_NAME ] then check_libs $FILE_NAME fi fi done done # Теперь библиоттеки # создаем структуру каталогов: mkdir -p $CHROOT_PREFIX mkdir -p $CHROOT_PREFIX/dev mkdir -p $CHROOT_PREFIX/etc mkdir -p $CHROOT_PREFIX/lib mkdir -p $CHROOT_PREFIX/tmp mkdir -p $CHROOT_PREFIX/var/cache/proxy mkdir -p $CHROOT_PREFIX/var/run mkdir -p $CHROOT_PREFIX/var/run/mysql mkdir -p $CHROOT_PREFIX/home # выставляем 'sticky bit' на /tmp: chmod 1777 $CHROOT_PREFIX/tmp # создаем файл устройства /dev/null: mknod $CHROOT_PREFIX/dev/null c 1 3 chmod 666 $CHROOT_PREFIX/dev/null chown root:sys $CHROOT_PREFIX/dev/null cp -a /dev/random $CHROOT_PREFIX/dev cp -a /dev/urandom $CHROOT_PREFIX/dev # копируем конфигурационные файлы: #cat /etc/group|egrep "he:|nobody:|nogroup:" > $CHROOT_PREFIX/etc/group #cat /etc/passwd|egrep "apache:|nobody:" > $CHROOT_PREFIX/etc/passwd #cat /etc/shadow|egrep "apache:|nobody:" > $CHROOT_PREFIX/etc/shadow chmod 640 $CHROOT_PREFIX/etc/shadow cp /etc/host.conf $CHROOT_PREFIX/etc cp /etc/hosts $CHROOT_PREFIX/etc cp /etc/nsswitch.conf $CHROOT_PREFIX/etc cp /etc/resolv.conf $CHROOT_PREFIX/etc cp /etc/localtime $CHROOT_PREFIX/etc # копируем данные и лог-файлы: # (не уверен что это нужно) #cp -R $APACHE_DATADIR $PREFIX`dirname $APACHE_DATADIR` #cp -R /var/log/apache2 $PREFIX/var/log # копируем бинарные файлы: # копируем библиотеки: cp -d /lib/i386-linux-gnu/libnss_compat* $CHROOT_PREFIX/lib/i386-linux-gnu/ cp -d /lib/libnss_dns* $CHROOT_PREFIX/lib cp -d /lib/ld-* $CHROOT_PREFIX/lib cp -d /lib/libnsl* $CHROOT_PREFIX/lib cp -R -d /usr/lib/gconv $CHROOT_PREFIX/usr/lib cp -d -R /usr/lib/locale/en_GB $CHROOT_PREFIX/usr/lib/locale cp -d -R /usr/lib/locale/en_GB.utf8 $CHROOT_PREFIX/usr/lib/locale cp -d -R /usr/lib/locale/ru_RU $CHROOT_PREFIX/usr/lib/locale cp -d -R /usr/lib/locale/ru_RU.koi8r $CHROOT_PREFIX/usr/lib/locale cp -d -R /usr/lib/locale/ru_RU.utf8 $CHROOT_PREFIX/usr/lib/locale # cp -d -R /etc/mime.types $CHROOT_PREFIX/etc #cp -a /etc/apache2 $CHROOT_PREFIX/etc/apache2