| 1 | #!/bin/bash |
|---|
| 2 | |
|---|
| 3 | # |
|---|
| 4 | # Usage: ./create_chroot_env username |
|---|
| 5 | # |
|---|
| 6 | |
|---|
| 7 | # Here specify the apps you want into the enviroment |
|---|
| 8 | APPS="/usr/bin/env /usr/bin/who /bin/df /bin/cp /bin/ping /usr/bin/unzip /usr/bin/wget /usr/bin/ftp /usr/bin/dig /usr/bin/traceroute /usr/bin/host /bin/sh /bin/grep /bin/cat /usr/bin/pico /bin/gzip /bin/gunzip /bin/bash /bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /usr/bin/id /usr/bin/ssh /bin/ping /usr/bin/dircolors /usr/bin/less /usr/bin/tail /usr/bin/nslookup /usr/bin/resolveip /bin/tar /bin/ln /bin/chmod" |
|---|
| 9 | |
|---|
| 10 | # Sanity check |
|---|
| 11 | if [ "$1" = "" ] ; then |
|---|
| 12 | echo " Usage: ./create_chroot_env username" |
|---|
| 13 | exit |
|---|
| 14 | fi |
|---|
| 15 | |
|---|
| 16 | CHROOT_USERNAME=$1 |
|---|
| 17 | HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME" | cut -d':' -f 6` |
|---|
| 18 | cd $HOMEDIR |
|---|
| 19 | |
|---|
| 20 | mkdir etc |
|---|
| 21 | mkdir bin |
|---|
| 22 | mkdir usr |
|---|
| 23 | mkdir usr/bin |
|---|
| 24 | mkdir lib |
|---|
| 25 | mkdir lib/terminfo |
|---|
| 26 | |
|---|
| 27 | echo "#!/bin/bash" > usr/bin/groups |
|---|
| 28 | echo "id -Gn" >> usr/bin/groups |
|---|
| 29 | |
|---|
| 30 | # Add some users to ./etc/paswd |
|---|
| 31 | grep /etc/passwd -e "^root" -e "^$CHROOT_USERNAME" > etc/passwd |
|---|
| 32 | grep /etc/group -e "^root" -e "^$CHROOT_USERNAME" > etc/group |
|---|
| 33 | |
|---|
| 34 | |
|---|
| 35 | if [ -x ${HOMEDIR}/ldlist ]; then |
|---|
| 36 | mv ${HOMEDIR}/ldlist ${HOMEDIR}/ldlist.bak |
|---|
| 37 | fi |
|---|
| 38 | |
|---|
| 39 | if [ -x ${HOMEDIR}/lddlist2 ]; then |
|---|
| 40 | mv ${HOMEDIR}/lddlist2 ${HOMEDIR}/lddlist2.bak |
|---|
| 41 | fi |
|---|
| 42 | |
|---|
| 43 | for app in $APPS; do |
|---|
| 44 | # First of all, check that this application exists |
|---|
| 45 | if [ -x $app ]; then |
|---|
| 46 | # Check that the directory exists; create it if not. |
|---|
| 47 | app_path=`echo $app | sed -e 's#\(.\+\)/[^/]\+#\1#'` |
|---|
| 48 | if ! [ -d .$app_path ]; then |
|---|
| 49 | mkdir -p .$app_path |
|---|
| 50 | fi |
|---|
| 51 | |
|---|
| 52 | # If the files in the chroot are on the same file system as the |
|---|
| 53 | # original files you should be able to use hard links instead of |
|---|
| 54 | # copying the files, too. Symbolic links cannot be used, because the |
|---|
| 55 | # original files are outside the chroot. |
|---|
| 56 | cp -p $app .$app |
|---|
| 57 | |
|---|
| 58 | # get list of necessary libraries |
|---|
| 59 | ldd $app >> ${HOMEDIR}/ldlist |
|---|
| 60 | fi |
|---|
| 61 | done |
|---|
| 62 | |
|---|
| 63 | # Clear out any old temporary file before we start |
|---|
| 64 | if [ -e ${HOMEDIR}/ldlist2 ]; then |
|---|
| 65 | rm ${HOMEDIR}/ldlist2 |
|---|
| 66 | fi |
|---|
| 67 | |
|---|
| 68 | for libs in `cat ${HOMEDIR}/ldlist`; do |
|---|
| 69 | frst_char="`echo $libs | cut -c1`" |
|---|
| 70 | if [ "$frst_char" = "/" ]; then |
|---|
| 71 | echo "$libs" >> ${HOMEDIR}/ldlist2 |
|---|
| 72 | fi |
|---|
| 73 | done |
|---|
| 74 | |
|---|
| 75 | for lib in `cat ${HOMEDIR}/ldlist2`; do |
|---|
| 76 | mkdir -p .`dirname $lib` > /dev/null 2>&1 |
|---|
| 77 | |
|---|
| 78 | # If the files in the chroot are on the same file system as the original |
|---|
| 79 | # files you should be able to use hard links instead of copying the files, |
|---|
| 80 | # too. Symbolic links cannot be used, because the original files are |
|---|
| 81 | # outside the chroot. |
|---|
| 82 | cp $lib .$lib |
|---|
| 83 | done |
|---|
| 84 | |
|---|
| 85 | # |
|---|
| 86 | # Now, cleanup the 2 files we created for the library list |
|---|
| 87 | # |
|---|
| 88 | /bin/rm -f ${HOMEDIR}/ldlist |
|---|
| 89 | /bin/rm -f ${HOMEDIR}/ldlist2 |
|---|
| 90 | |
|---|
| 91 | cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 ./lib/ |
|---|
| 92 | cp -R /lib/terminfo/* ./lib/terminfo/ |
|---|
| 93 | cp /etc/profile ./etc/ |
|---|