作业——拷贝命令及其链接库
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"菜退出文
# 传递给函数可执行命令,复制命令程序和依赖库文件到指定目录 ,并且取掉绝对路径
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