Linux

某處是否有 chroot 建構腳本?

  • January 16, 2013

我即將開發一個小腳本來收集 chroot-jail 的資訊。

就我而言,這看起來(乍一看)非常簡單:該應用程序有一個乾淨的 rpm-install,並且確實將幾乎所有文件安裝到 /opt 的子目錄中。

我的想法是:

  • 查找所有二進製文件
  • 檢查他們的庫依賴
  • 將結果記錄到列表中
  • 在啟動應用程序之前將該列表同步到 chroot-target-directory

現在我想知道 - 是否有任何腳本已經完成了這樣的工作(perl/bash/python)?

到目前為止,我只找到了針對單個應用程序(如 sftp-chroot)的專門解決方案。

雖然沒關係(恕我直言) - 作業系統是 CentOS 5 x86_64 目前的次要版本和更新檔級別。

rpm -ql恕我直言,不夠通用,因為它只涵蓋基於rpm的發行版。上面提到的“全新安裝”只是提到該軟體的文件並未分佈在整個文件系統中。所以我的出發點是 - 目前 - 一個find /opt/directory/……應該適用於幾乎任何系統(甚至不是 Linux)。

我建議創建一個模板 chroot 並安裝所有你想要的包,就像它是一個普通的作業系統一樣。之後,您可以使用典型工具(更新腳本、包管理器等)管理 chroot,並將更新同步到使用該模板建構的每個 chroot 中。

這種方法有幾個優點。最大的兩個是您可以使用熟悉的工具管理模板(沒有奇怪的箍跳來升級您的 chroot),如果您有一個 chroot由於某種原因無法更新(比如說它需要某個特定版本包)您可以將其從rsync升級過程中排除並獨立管理它,就好像它是一台獨立的機器一樣,將包標記為“持有”或等效的,這樣它就不會被踩到。

您的里程(和實施要求)可能會有所不同……

現在這是我的 scipt 目前所在的位置:

mkchroot.cfg:

# Configuration file for building a chroot envirnoment with Linux
#
# V 1.2 2012-10-24
#
# Define which directories to scan for executables
#  use space to separate directories
DIRS="/opt/application /opt/bin"
#
# Define a number of files to check outside the dirctories set in the DIRS
# directive above. Use space to separate entries.
FILES="/bin/sh"
#
# Define additional things that should be added to chroot without check.
# This could be block or char-devices. Use space to separate entries. 
ADDITIONAL="/dev/urandom /dev/null /var/lock/subsys /var/application"
#
# Target chroot-directory
TARGETDIR=="/var/lib/application"
#
# Here goes the list of files that has to be synced to chroot
FILELIST="/tmp/chroot_files.dat"
#

mkchroot.sh

#!/bin/sh
. /opt/application/mkchroot.cfg
getlibs ()
{
 # Parameter1: Name of a file containing files to check
 for b in $(cat ${1})
   do
     ldd $b |grep -v ":"|grep "/"|sed "s/.*>//g; s/ (.*//g"|awk '{print $1}'
 done
}
# Main program
clear
for f in ${FILELIST}_bin ${FILELIST}_tmp ${FILELIST}_lib ${FILELIST}
 do
   [ -f $f ] && rm $f
done
for d in $DIRS
 do
   echo Build filelist for directory $d
   find $d -type f -exec file {} \; 2>/dev/null |grep ELF |cut -d : -f 1 >>${FILELIST}_bin
done
for f in $FILES
 do
   echo $f >>${FILELIST}_bin
done
echo Find libaries on stage 1
getlibs ${FILELIST}_bin >>${FILELIST}_tmp
# Now find indirect libraries until list does not get any longer...
sort -u ${FILELIST}_tmp >${FILELIST}_lib
typeset -i LIBNEW="$(wc -l <${FILELIST}_lib )" LIBOLD=0 STAGE=2
while [ $LIBNEW -ne $LIBOLD ]
 do
   echo Find libaries on stage $STAGE
   let STAGE++
   LIBOLD=$LIBNEW
   cp ${FILELIST}_lib ${FILELIST}_tmp
   getlibs ${FILELIST}_lib >>${FILELIST}_tmp
   sort -u ${FILELIST}_tmp >${FILELIST}_lib
   LIBNEW=$(wc -l <${FILELIST}_lib)
done
cp ${FILELIST}_lib ${FILELIST}_tmp
for e in $ADDITIONAL
 do
   echo $e >>${FILELIST}_tmp
done
echo Für chroot zu synchronisierende Dateien:
GDIRS=$(echo $DIRS |sed "s/ /\\\|/g;")
grep -v "$GDIRS" ${FILELIST}_tmp |sort -u >${FILELIST}
cat $FILELIST

仍然存在的問題:我的 chroot 中有 shell 文件。他們可能會引用其他一些二進製文件。

作為解決方法,這些必須手動放入 $FILES 中。

引用自:https://serverfault.com/questions/438892