Note: You are viewing an old version of this page. View the current version.

Differences between version 3 and previous revision of KnowledgeBase/Scripts/chroot_bin.sh.

Other diffs: Previous Major Revision, Previous Author

Newer page: version 3 Last edited on Monday, 15 March 2010 8:03:31 by CyberLeo Revert
Older page: version 2 Last edited on Monday, 15 March 2010 7:59:59 by CyberLeo Revert
@@ -67,10 +67,10 @@
  [ -d "${tgt}" -a -x "${bin}" ] || return 1 
  tmp="$(populate_chroot "${tgt}" "${bin}")" 
  exe="$(basename "${bin}")" 
  mount -t unionfs "${tmp}" "${tgt}" 
- ( sleep 1; umount -f "${tgt}" ) & 
+ ( sleep 1; umount -f "${tgt}"; rm -Rf "${tmp }" ) & 
  LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@}" 
 
  ;; 
 esac 
 </code> 

version 3

case "$(uname -s)" in
Linux)
  libscan() {
    [ "${1}" ] || return 1
    (
     echo /lib/ld-linux.so.2
     while [ "${1}" ]
     do
       if [ -x "${1}" ]
       then
         ldd "${1}" | sed -e '/ => /!d; s/^.* => //; s/ (0x[0-9a-f]*)$//; /^[     ]*$/d'
       fi
       shift
     done
    ) | sort | uniq
  }
  populate_chroot() {
    dest="${1}"; shift
    bins="${@}"
    libs="$(libscan "${@}")"
    temp="$(mktemp -d "${dest}/.chroot.XXXXXXXX")"
    [ -d "${temp}" ] || return 1
    cp -p ${bins} ${libs} ${temp}/
    echo "$(basename "${temp}")"
  }
  chroot_bin() {
    tgt="${1}"; shift
    bin="$(which "${1}")"; shift
    [ -d "${tgt}" -a -x "${bin}" ] || return 1
    tmp="$(populate_chroot "${tgt}" "${bin}")"
    exe="$(basename "${bin}")"
    ( sleep 1; rm -Rf "${tgt}/${tmp}" ) &
    LD_LIBRARY_PATH="/${tmp}/" /usr/bin/chroot "${tgt}" "/${tmp}/ld-linux.so.2" "/${tmp}/${exe}" "${@}"
  }
  ;;
FreeBSD)
  libscan() {
    [ "${1}" ] || return 1
    (
      echo "/libexec/ld-elf.so.1"
      while [ "${1}" ]
      do
        if [ -x "${1}" ]
        then
          ldd "${1}" | sed -e '/ => /!d; s/^.* => //; s/ (0x[0-9a-f]*)$//; /^[     ]*$/d'
        fi
        shift
      done
    ) | sort | uniq
  }
  populate_chroot() {
    dest="${1}"; shift
    bins="${@}"
    libs="$(libscan "${@}")"
    temp="$(mktemp -d "/tmp/.chroot.XXXXXXXX")"
    [ -d "${temp}" ] || return 1
    mkdir -p "${temp}/.run"
    cp -p ${bins} ${libs} "${temp}/.run/"
    mkdir -p "${temp}/libexec"
    ln -f "${temp}/.run/ld-elf.so.1" "${temp}/libexec/"
    echo "${temp}"
  }
  chroot_bin() {
    tgt="${1}"; shift
    bin="$(which "${1}")"; shift
    [ -d "${tgt}" -a -x "${bin}" ] || return 1
    tmp="$(populate_chroot "${tgt}" "${bin}")"
    exe="$(basename "${bin}")"
    mount -t unionfs "${tmp}" "${tgt}"
    ( sleep 1; umount -f "${tgt}"; rm -Rf "${tmp}" ) &
    LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@}"
  }
  ;;
esac