某處是否有 chroot 建構腳本?
我即將開發一個小腳本來收集 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 中。