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

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

Other diffs: Previous Major Revision, Previous Author

Newer page: version 2 Last edited on Monday, 15 March 2010 7:59:59 by CyberLeo Revert
Older page: version 1 Last edited on Monday, 15 March 2010 7:52:31 by CyberLeo Revert
@@ -24,15 +24,15 @@
  cp -p ${bins} ${libs} ${temp}/ 
  echo "$(basename "${temp}")" 
 
  chroot_bin() { 
- tgt="${1}"  
- bin="${2 }" 
+ 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}" 
+ LD_LIBRARY_PATH="/${tmp}/" /usr/bin/chroot "${tgt}" "/${tmp}/ld-linux.so.2" "/${tmp}/${exe}" "${@ }" 
 
  ;; 
 FreeBSD) 
  libscan() { 
@@ -61,16 +61,16 @@
  ln -f "${temp}/.run/ld-elf.so.1" "${temp}/libexec/" 
  echo "${temp}" 
 
  chroot_bin() { 
- tgt="${1}"  
- bin="${2 }" 
+ 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}" ) & 
- LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" 
+ LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@ }" 
 
  ;; 
 esac 
 </code> 

version 2

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}" ) &
    LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@}"
  }
  ;;
esac