copycmd-拷贝命令及其依赖库

题目:

编写脚本/root/bin/copycmd.sh 
(1) 提示用户输入一个可执行命令名称 
(2) 获取此命令所依赖到的所有库文件列表 
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下       如:/bin/bash ==> /mnt/sysroot/bin/bash  /usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd 
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:  如:/lib64/ldlinux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2 
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令, 并重复完成上述功能;直到用户输入quit退出 
[root@imooc-nginx scripts]# cat copycmd1.0.2.sh 
#!/bin/bash
GREEN="\033[1;32m"
RED="\033[1;31m"
END_COLOR="\033[0m"

. /etc/init.d/functions  #CentOS7 CentOS6可以运行
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#目标目录即要放文件的目录,最后面不要加斜杠/
TARGET_PATH=/tmp/haha

while true;do   #做了个大循环
    while true;do
        read -e -p "请输入要查询的命令:" CMD
        if [ "$CMD" = "quit" ];then break 2;fi
        CMD_PATH=`which --skip-alias $CMD`
        ldd ${CMD_PATH} &>/dev/null
        [ ! "$?" = "0" ] && echo -e "${RED}你输入的命令有误(不可查,不存在,不是动态可执行文件)! \n请重新输入! ${END_COLOR}" || break
    done

    #取命令的目录名和基名
    CMD_DIRNAME=$(dirname ${CMD_PATH})
    #CMD_BASENAME=$(basename ${CMD_PATH})
    mkdir -p ${TARGET_PATH}  #创建目标目录,防止不存在
    mkdir -p ${TARGET_PATH}${CMD_DIRNAME}  #创建目标命令的目录
    cp -L ${CMD_PATH} ${TARGET_PATH}${CMD_DIRNAME} #复制命令
    echo -e "${GREEN}目标目录(如果需要,自己修改脚本第9行):${TARGET_PATH}${END_COLOR}"

    #搜索带/的行,并将文件名过滤出来
    #ldd_files=$(ldd ${CMD_PATH} | sed -rn '/\//s#.* (/.*) .*#\1#p')  #这条命令有点问题ldd /usr/bin/who发现第二个文件前面是个tab,而不是空格,这样就少了一个文件
    ldd_files=$(ldd ${CMD_PATH} | sed -rn '/\//s#[^/]*(/.*) .*#\1#p')

    for i in ${ldd_files};do
        #动态库文件取目录名和基名
        ldd_files_dirname=$(dirname ${i})
        ldd_files_basename=$(basename ${i})
        #创建库文件目录
        mkdir -p ${TARGET_PATH}${ldd_files_dirname}
       #这里使用-L,有些文件是软链接
        action "copying $basename ${i} -> ${TARGET_PATH}${ldd_files_dirname}${ldd_files_basename}" cp -L $i ${TARGET_PATH}${ldd_files_dirname}
    done
done

执行效果:

copycmd-拷贝命令及其依赖库_第1张图片