LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 979|回复: 2

bash之递归实例:拷贝库文件,或叫建立chroot jail

[复制链接]
发表于 2007-3-21 10:08:31 | 显示全部楼层 |阅读模式
程序代码


  1. [0 No.610 root@huanlf ~/svn/tools]# cat get_ldd.sh
  2. #! /bin/sh

  3. # 用途:拷贝程序/库所依赖的库文件
  4. # 作者:huanlf AT gmail.com
  5. # GPL v2

  6. # ldd
  7. get_so(){
  8.     ldd $1 | awk '{ if ($3 ~ /^\//){ print $3 } else if ($1 ~ /^\//){ print $1 } }'
  9. }

  10. # 取得并拷贝符号链接
  11. get_link(){
  12.     local sym_link=$( readlink $1 )
  13.    
  14.     # 防止相对路径
  15.     case $sym_link in
  16.         /*);;
  17.         *) sym_link=${1%/*}/$sym_link
  18.     esac

  19.     local sym_path=${sym_link%/*}

  20.     [ -d $dst/$sym_path ] || mkdir $dst/$sym_path
  21.     [ -e $dst/$sym_link ] || cp -a $sym_link $dst/$sym_link
  22.    
  23.     # 再次检查链接
  24.     [ -h $sym_link ] && get_link $sym_link
  25. }

  26. # 取得并拷贝依赖的so库文件
  27. get_ldd(){
  28.     local so
  29.     for so in $( get_so $1 ); do
  30.         path=${so%/*}
  31.         [ -d $dst/$path ] || mkdir -p $dst/$path
  32.         [ -e $dst/$so ] || cp -a $so $dst/$so
  33.         [ -h $so ] && get_link $so
  34.         get_ldd $so
  35.     done
  36. }


  37. # -------------main----------------
  38. if [ "$#" != 2 ]; then
  39.     echo "用法: get_ldd  程序 目标文件夹"
  40.     echo
  41.     exit
  42. fi

  43. app=$1; shift
  44. dst=$1; shift

  45. case $app in
  46.     ./*|/*);;
  47.     *) [ -f $app ] || app=`which $app`;;
  48. esac

  49. [ -z $app ] && {
  50.     echo "没有找到$app"
  51.     exit 1
  52. }

  53. mkdir -p $dst || exit $?

  54. get_ldd $app
复制代码


# 运行并查看结果

  1. [0 No.611 root@huanlf ~/svn/tools]# ./get_ldd.sh ls ls-chroot

  2. [0 No.612 root@huanlf ~/svn/tools]# tree ls-chroot
  3. ls-chroot
  4. `-- lib
  5.     |-- ld-2.4.so
  6.     |-- ld-linux.so.2 -> ld-2.4.so
  7.     |-- libacl.so.1 -> libacl.so.1.1.0
  8.     |-- libacl.so.1.1.0
  9.     |-- libattr.so.1 -> libattr.so.1.1.0
  10.     |-- libattr.so.1.1.0
  11.     |-- libc-2.4.so
  12.     |-- libc.so.6 -> libc-2.4.so
  13.     |-- libdl-2.4.so
  14.     |-- libdl.so.2 -> libdl-2.4.so
  15.     |-- libpthread-2.4.so
  16.     |-- libpthread.so.0 -> libpthread-2.4.so
  17.     |-- librt-2.4.so
  18.     |-- librt.so.1 -> librt-2.4.so
  19.     |-- libselinux.so.1
  20.     `-- libsepol.so.1

  21. 1 directory, 16 files
复制代码


# 构建chroot jail运行测试

  1. [0 No.613 root@huanlf ~/svn/tools]# cp `which ls` ls-chroot/

  2. [0 No.614 root@huanlf ~/svn/tools]# chroot ls-chroot/ ./ls -R
  3. .:
  4. lib  ls

  5. ./lib:
  6. ld-2.4.so      libacl.so.1.1.0   libc-2.4.so   libdl.so.2         librt-2.4.so     libsepol.so.1
  7. ld-linux.so.2  libattr.so.1      libc.so.6     libpthread-2.4.so  librt.so.1
  8. libacl.so.1    libattr.so.1.1.0  libdl-2.4.so  libpthread.so.0    libselinux.so.1

  9. [0 No.615 root@huanlf ~/svn/tools]#
复制代码


可以看出
只要加上一行代码
把要运行的二进制放入去
一个chroot jail就建好了:)

欢迎提出意见

P.S. svn位于 http://svn.inlsd.org/svn/inlsd/tools/get_ldd.sh
发表于 2007-3-21 10:56:25 | 显示全部楼层
不错, 收藏了.

以前出于某些目的也常临时建立一些这些小环境, 但一直是手工的, 却从未考虑过写个程序自动完成. 感谢楼主
回复 支持 反对

使用道具 举报

发表于 2007-3-21 12:52:37 | 显示全部楼层
很好的思路。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表