Skip to content

Instantly share code, notes, and snippets.

@nerdlich
Last active March 25, 2016 13:13
Show Gist options
  • Save nerdlich/0c4c0185d593a6deca04 to your computer and use it in GitHub Desktop.
Save nerdlich/0c4c0185d593a6deca04 to your computer and use it in GitHub Desktop.
Script that prepares a ssh chroot
#!/bin/bash
if (( $# < 2 )); then
echo "Usage: $0 chroot_dir program [program ...]"
exit 1
else
CHROOT="$1"; shift
fi
function same_file() {
orig="$1"
copy="$2"
orig_md5=$(md5sum $orig | cut -d' ' -f1)
copy_md5=$(md5sum $copy | cut -d' ' -f1)
[ "$orig_md5" = "$copy_md5" ] && return 0 || return 1
}
for prog in $@; do
# copy binary if not prepared or not up2date
prog=$(which $prog)
if [ ! -f "${CHROOT}${prog}" ] || ! same_file "$prog" "${CHROOT}${prog}"; then
echo "copying $prog"
pdir=$(dirname $prog)
[ ! -d "${CHROOT}${pdir}" ] && mkdir -p "${CHROOT}${pdir}"
cp $prog "${CHROOT}${pdir}/"
else
echo "$prog already copied"
fi
# libs
libs="$(ldd $prog | awk '{ print $3 }' | egrep -v ^'\(')"
for lib in $libs; do
# copy lib if not prepared nor not up2date
if [ ! -f "${CHROOT}${lib}" ] || ! same_file "$lib" "${CHROOT}${lib}"; then
echo "copying $lib"
ldir="$(dirname $lib)"
[ ! -d "${CHROOT}${ldir}" ] && mkdir -p "${CHROOT}${ldir}"
cp $lib "${CHROOT}${ldir}/"
else
echo "$lib already copied"
fi
done
# copy /lib/ld-linux* or /lib64/ld-linux* if not prepared or not up2date
ldlinux="$(ldd $prog | grep 'ld-linux' | awk '{ print $1 }')"
if [ ! -f "${CHROOT}${ldlinux}" ] || ! same_file "$ldlinux" "${CHROOT}${ldlinux}"; then
echo "copying $ldlinux"
ldlinuxdir="$(dirname $ldlinux)"
[ ! -d "${CHROOT}${ldlinuxdir}" ] && mkdir -p "${CHROOT}${ldlinuxdir}"
cp $ldlinux "${CHROOT}${ldlinuxdir}/"
else
echo "$ldlinux already copied"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment