作业——拷贝命令及其链接库

1),提示用户输入一个可执行命令的名称

2),获取此命令所依赖额所有库文件列表

3),复制命令至某目标目录(/mnt/sysroot,即把此目录当做根)下的对的路径中

bash,/bin/bash ===> /mnt/sysroot/bin/bash

useradd, /usr/sbin/useradd ===> /mnt/sysroot/usr/sbin/useradd

4),复制此命令所有依赖的所有库文件至目标目录对应的路径下:

/lib64/ld-linux-x86_64.so.2 ==>

/mnt/sysroot/lib64/ld-linux-x86_64.so.2

5,每次复制完成一个命令后,不要退出,而是继续提示用户输入命令,直到输入"quit"菜退出文

blob.png

# 传递给函数可执行命令,复制命令程序和依赖库文件到指定目录 ,并且取掉绝对路径

f_copy_com_lib() {

     command_path=$(which "$1" | grep -v "alias") #获取绝对路径

     temp_dir=${command_path#*/} # 取掉绝对路径

     temp_dir=${temp_dir%/*} # 取掉后面的文件文件名

     mkdir -p $dir_path$temp_dir # 创建/mnt/sysroot下对应的的目录

     cp -rf $command_path  $dir_path$temp_dir

    

    #获取命令路径要注意两个问题:第一个要避开which查出结果有alias别名问题, which COM | grep -v "alias" 除去别名

     #第一步,查出命令路径,第二步,去掉alias,第三步,查出命令所以来的库,第四步,获取库的准确路径

     for lib_file in $( ldd $(which "$1" | grep -v "alias" ) | grep -o "/lib[^[:space:]]*") ; do

     #a_library[$i]=$lib_file # 完整的库文件路径

    

     temp_dir=${lib_file#*/} #取掉绝对路径 ${string#*word} 

     temp_dir=${temp_dir%/*} #去掉基名

     mkdir -p $dir_path$temp_dir #创建一个库文件的路径 

     cp -rf $lib_file   $dir_path$temp_dir  #复制库文件到指定的目录中

     #echo "${a_library[$i]}" #let i++

     echo "$lib_file"

     echo 

done

}

while true ; do

cat << EOF

+++++++++++++++++++++++++++++++++++++++++++++++++

command)Please enter the system existing  command

quit) quit script

+++++++++++++++++++++++++++++++++++++++++++++++++

EOF

read -p "Please enter existing command:" v_command

if [ $v_command == "quit" ] ; then

break

fi

#如果输入的不存在的命令,处理

if ! ( which $v_command &>/dev/null ) ; then

echo "ERROR:command not found!"

continue # 进行下一次循环

fi

f_copy_com_lib  $v_command

don

blob.png

原创文章,作者:不忘初衷,如若转载,请注明出处:http://www.178linux.com/67529

(0)
不忘初衷不忘初衷
上一篇 2017-02-04 11:43
下一篇 2017-02-05 14:54

相关推荐

  • 网络基础

    1、OSI模型七层结构 应用层   为应用程序进程提供网络服务   提供用户身份验证   表示层     确保接收系统可以读出该数据     格式化数据     构建数据 &nbs…

    Linux干货 2016-09-06
  • 文件权限特殊管理之ACL

    ACL:access control list 权限访问列表 应用范围:所属主和所属组和其他用户之外的他叔用户 ACL是Linux系统权限额外支持的一项功能,需要文件系统的支持,例如:ReiserFS , EXT2 , EXT3 , EXT4 , JFS , XFS等都支持ACL功能 centos7 中:安装系统分区和装完系统之后自己手动添加的分区自动支持a…

    Linux干货 2016-08-05
  • 整型、浮点型在内存中的存储方式

      在学习C语言的过程中,有时候会想,数据到底是以什么样的方式在内存中存储的呢?经过一段时间的查阅资料,小编终于整理了一些…… 以VC6.0编译器为测试环境(int型为4Byte) 先简介一下大小端模式,具体资料可参考 http://blog.csdn.net/ce123_zhouwei/article/details/6971544  …

    Linux干货 2016-01-14
  • 超全超详细的HTTP状态码大全

    本部分余下的内容会详细地介绍 HTTP 1.1中的状态码。这些状态码被分为五大类:  100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 500-599 用…

    Linux干货 2015-03-20
  • rpm

    软件运行环境 API:Application Programming Interface     POSIX:Portable OS 程序源代码–> 预处理–> 编译–> 汇编–> 链接   &nb…

    Linux干货 2016-08-21
  • 马哥教育网络第21期-第十周课程练习

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 1.post加电自检,bios检测基础硬件设备 2.boot sequence:按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;读取启动设备MBR中 的bootloader,启动GRUB,选择内核加载到内存中。 3.kernel:自身初始化:探测可识别到的…

    Linux干货 2016-11-14

评论列表(1条)

  • 马哥教育
    马哥教育 2017-04-10 15:52

    脚本的思路清晰,使用了函数功能,加油!!!