编写脚本/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/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出。
该脚本使用到了函数、递归等知识,难度相对较高,逻辑性较强,脚本内容如下:
#!/bin/bash
#------------------------------------------
# Filename:copycmd72.sh
# Revision:1.0
# Date:2017-09-11
# Author:156
# Email:1140994710@qq.com
# Description:用于复制命令和他的库文件到/mnt/sysroot/目录下。
#------------------------------------------
#判断用户输入的命令是不是命令
com() {
local var1
man $1 &>/dev/null
var1=$?
if [ $var1 -eq 0 ];then
return 0
else
echo -e "\terror,找不到\e[33m${1}命令\e[0m,您请确认!"
return 1
fi
}
#判断命令是内部命令还是外部命令
encmd() {
local var2=`type $1`
local var3=`echo $var2 | grep -o "builtin"`
if [ -n "$var3" ];then
echo -e "\terror,\e[34m${CMD}是内部命令\e[0m,不可以复制!"
return 1
else
return 0
fi
}
#判断文件类型的函数
filetype() {
file=`ls -l $1 | grep -o "^."`
case $file in
-)
return 0
;;
d)
return 1
;;
l)
return 2
;;
esac
}
#创建目录的函数
createdir() {
local dirnm=`dirname $1`
mkdir -p ${Dir}${dirnm}
targetdir=${Dir}${dirnm}
return 0
}
#复制文件的函数
copy() {
filetype $1
local ft=$?
if [ $ft -eq 0 ];then
createdir $1
cp -pdr $1 $targetdir &> /dev/null
echo -e "\t\t$1\t\c"
echo -e "========>\t\c"
echo -e "\e[31m${targetdir}\e[0m"
return 0
elif [ $ft -eq 2 ];then
createdir $1
cp -pdr $1 $targetdir &> /dev/null
echo -e "\t\t$1\t\c"
echo -e "========>\t\c"
echo -e "\e[31m${targetdir}\e[0m"
lianjiewenjian=$(locate `ls -l $1 | cut -d " " -f 11`)
copy $lianjiewenjian
fi
}
Dir="/mnt/sysroot"
mkdir -p $Dir
while true;do
read -p "请输入一个您想要复制的命令(quit:退出):" cmd
CMD=`basename $cmd`
if [ "$CMD" == "quit" ];then
exit 1
fi
com $CMD
if [ $? == 0 ];then
encmd $CMD
encmd=$?
if [ $encmd -eq 0 ];then
#因为在脚本里面不可以执行别名所以,不需要varA=`which ls | grep "^[[:space:]]" | grep -o "/.*"`
varA=`which $CMD`
echo -e "\t\e[5;31m${CMD}命令\e[0m正在复制……"
copy $varA
for A in `for i in $(ldd $varA);do echo $i ;done | grep -o "/.*"` ;do
copy $A
done
echo -e "\t\e[5;31m${CMD}命令\e[0m复制结束!"
fi
fi
done
小编刚接触linux,水平一般,脚本中的内容也比较冗杂,该博客的目的只是为了给大家一个思路,希望能起到抛砖引玉的效果。