文章目录
- 1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核
- 2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
- 3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
- 4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序。
- 5.IP的有效性实验
- 6.if,else嵌套性试验(检测用户是否存在,存在即显示信息,否则询问是否创建此用户)
- 6.1知识点总结:
- 19.1 判断/var/目录下所有文件的类型
- 19.2添加10个用户user1-user10,密码为8位随机字符
- 19.3/etc/rc.d/rc3.d目录下分别分别有多个以k开头和以S开头的文件;分别读取每个文件以k开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
- 19.4编写脚本,提示输入正整数n的值,计算1+2+…n的总和
- 19.5计算100以内所有能被3整除的整数之和
- 19.6编写脚本,提示请输入网址,如192.168.0.0,判断输入的网段中主机在线的状
- 19.7打印99乘法表
- 19.8在/etcdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
- 19.9打印等腰三角形
- 19.10猴子第一天摘下若干个桃子,当即吃了一半,还不够,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子,求第一天摘了多少桃子。
- 20.1编写脚本,求100内所有正奇数之和
- 20.2编写脚本,提示输入网络地址,如192.168.0.0,判断输入的网段中主机的在线状态,并统计在线和离线主机各有多少
- 20.3编写脚本,打印9×9乘法表
- 20.4 编写脚本用变量RANDOM生成10个随机数,输出这10个数字,并显示其中的最大值和最小值。
- 20.5编写脚本,实现打印国际象棋
- 20.6后续六个字符串:efbaf257cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo$RANDOM|md5sum|cut -c1-10后的结果,请破解这些字符对应的RANDOM值。
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核
版本,CPU型号,内存大小,硬盘大小
#!/bin/bashCL=\"\\033[1;32m\"END=\'\\033[0m\'IPV4=`ifconfig eth0 |grep -Eo \'([0-9]{1,3}\\.){3}[0-9]{1,3}\'|head -n1`VS=`uname -a`KN=`uname -r`CPU=`lscpu |grep \'Model name\' |tr -s \' \' |cut -d: -f2`MEMORYSIZE=`free -h |grep \'Mem\' |tr -s \' \' : |cut -d: -f2`DISKSIZE=`lsblk |grep \'^sd\' |tr -s \' \' |cut -d \' \' -f1,4 |paste -s -d, `echo -e \"Hostname is : ${CL}${HOSTNAME}${END}\"echo -e \"IPV4 adress is : ${CL}${IPV4}${END}\"echo -e \"system\'s version : ${CL}${VS}${END}\"echo -e \"Kernel version is : ${CL}${KN}${END}\"echo -e \"CPU version is : ${CL}${CPU}${END}\"echo -e \"Memory\'s size is : ${CL}${MEMORYSIZE}${END}\"echo -e \"Disk size is : ${CL}${DISKSIZE}${END}\"
2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
#!/bin/bashCL=\"\\033[1;32m\"END=\"\\033[0m\"DT=`date +%F_%T`cp -av /etc /data/backup/etc_back.${DT}sleep 3echo -e \" ${CL}Done!${END} \"
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bashCL=\"\\033[1;33m\"END=\"\\033[0m\"TLN=`df |tr -s \' \' % |cut -d% -f5 |sort -nr |head -n1`echo -e \"The largest rate used of disk partition is :${CL}${TLN}${END}\"~
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序。
TLN=`ss -nt |ss -nt |tail -n +2 |tr -s \' \' \':\' |cut -d: -f4 |uniq -c |sort -nr`ADDR=`ss -nt |ss -nt |tail -n +2 |tr -s \' \' \':\' |cut -d: -f4 `echo -e \"Display the remote host connect\'s address and number of times:\\n${ADDR} \"echo -e \"sort positive sequence the num of address connect: ${TLN}\"~
5.IP的有效性实验
[[ ]]
6.if,else嵌套性试验(检测用户是否存在,存在即显示信息,否则询问是否创建此用户)
read -p \"Please input the username :\" NAMEINFO=\"echo `id ${NAME}`\"ifid ${NAME} &> /dev/nullthenecho -e \"\\033[1;32mThe user ${NAME} is exist,and ${NAME}\'s information:\\n${INFO}\\033[0m\"elseecho -e \"The user ${NAME} dont exist \"echo -e \"\\033[1;31mI will crate the account ${NAME},please choice \"yes\" or \"no\" \\033[0m\"read -p \"Please choice :\" YNif[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];thenuseradd ${NAME};echo \"${NAME}:123456\" |chpasswdchage -d1 ${NAME}echo \"The default password is 123456 ,you must change your passwd next login (force)\"elseecho -e \"\\033[1;33mwill leave and exit!!!\\033[0m\"fifi
6.1知识点总结:
1.读入
read -p \"提示语\" Agagaecho $Agaga
2.变量赋值与输出
变量赋值A=“ ” A=\" echo \\`id ${NAME}\\` \"NAME=aecho $NAME1echo${NAME}1NAME=\"`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c7` \"echo $NAMEtyBThpiecho ${NAME}tyBThpi
赋值打印seq的结果
NAME=`seq 10`echo $NAME1 2 3 4 5 6 7 8 9 10echo ${NAMR}1 2 3 4 5 6 7 8 9 10echo \"$NAME\"12345678910echo \"${NAME}\"12345678910
3.命令静默并传回值
id ${NAME} &> /dev/null
插入(ls xxx > /dev/null 2&>1;echo $?)回传的值总是错误
4.条件性测试
[ ]
[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]]支持摸估,==通配符摸估。=~正则表达式摸估
5.非交互式修改口令
echo “name:passwd ” |chpasswd
6.账户过期设置(下次登录必须修改口令)
chage -d1 ${NAME}passwd -e ${NAME}
chage -d参数可以将到期时间修改为指定天数
passwd -e 参数可以强制用户下次登录强制修改口令
7.if,else嵌套语句结构
ifthenelseifthenelsefifi
7.磁盘邮件预警
#!/bin/bashWARNINFO=\"`df |grep -E \'^/dev/sd*\' |tr -s \' \' |cut -d \' \' -f1,5,6 |sort -nr -k2 |head -n3`\"#LARSET=\"`df |grep -E \'^/dev/sd*\' |tr -s \' \' |cut -d \' \' -f1,5,6 |sort -nr -k2 |head -n1`\"#LARSET=\"`echo ${WARNINF} |tr -s \' \' \'%\' |cut -d% -f2 |sort -nr|head -n1`\"VALURE=\"`echo $WARNINFO |tr -s \'%\' \' \'|sort -nr |head -n1|cut -d \' \' -f2 `\"if[[ $VALURE -ge 10 ]]thenecho -e \"Your host\'s disk rate is more than 10%\\n${WARNINFO}\" |mail -v -s \"disk_rate \" 949786521@qq.comecho \"The rate is ${VAlURE} \"elseecho \"正常\"fi
8.让所有用户的PATH环境变量的值多出一个路径,例如:usr/local/apach/bin
修改环境变量
1.临时修改变量
PATH=$PATH:/usr/local/apache/binecho $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
2.永久修改环境变量
vim ~/.bashrcPATH=$PATH:$HOME:usr/local/apache/bin
9.用户root登录时,将命令提示符变成红色,并自动启用如下别名:rm=‘rm-i’,cdnet=‘cd /etc/sysconfig/network-scripts/’
vim /etc/profile.d/~/.bashrcPS1=\\033[1;31m \\033[0mrm=\"rm-i\"cdnet=\"cd /etc/sysconfig/network-scripts/\"
10.任意用户登录系统时,显示红色字体的警示信息“Hi,dangerous!”
登录前信息显示:
vim /etc/issue.d/*.shHi,dangerous!
登陆后信息显示:
vim /etc/motdwelcome to liujiajun\'s computer!!!
11.编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间描述等。
vim /etc/vimrcvim ~/.vimrc
请参考此链接内的题目1
12.测试网络连通性
read -p \"please input the adress\" ADDRESSifping -c2 -w2 ${ADDRESS} &> /dev/nullthenecho \"${ADDRESS} is up\"elifgrep -q \"${ADDRESS}\" ~/maintenance.txtthenecho \"${ADDRESS} is undergoing maintenance\"elseecho \"station is unexpecedly DOWN!\"fi
13.编写脚本createuser.sh,实现如下功能:使用一个用户名作为参数,如果指定参数的用户存在就显示其存在,否则添加它。并设置初始化密码为123456,显示添加用户的id号等信息在此新用户第一次登录时,会提示用户立即更改密码,如果没有参数,就提示:请输入用户名。
read -p \"Please input the username :\" NAMEINFO=\"echo `id ${NAME}`\"ifid ${NAME} &> /dev/nullthenecho -e \"\\033[1;32mThe user ${NAME} is exist,and ${NAME}\'s information:\\n${INFO}\\033[0m\"elseecho -e \"The user ${NAME} dont exist \"echo -e \"\\033[1;31mI will crate the account ${NAME},please choice \"yes\" or \"no\" \\033[0m\"read -p \"Please choice :\" YNif[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];thenuseradd ${NAME};echo \"${NAME}:123456\" |chpasswdchage -d1 ${NAME}echo \"The default password is 123456 ,you must change your passwd next login (force)\"elseecho -e \"\\033[1;33mwill leave and exit!!!\\033[0m\"fifi
14.编写脚本yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes或者no,或者其他的信息。
read -p \"Do you agree(yes/no)?\" INPUTVALUE=`echo $INPUT |tr -s \'A-Z\' \'a-z\'`case ${INPUT} inyes|ye|y)echo \"you input is YES\";;no|n)echo \"you input is NO\";;*)echo \"you input is others\"esac
15.编写脚本filetype.sh判断用户输入文件文件路径,显示其文件类型,(普通,目录吗,连接,其他文件类型)
read -p \"Please input the file name what you want to test:\" FILEif[ -f ${FILE} ]thenecho \"Its a normal file!\"elif[ -d ${FILE} ]thenecho \"Its a directory!\"elif[ -l ${FILE} ]thenecho\"Its a link file!\"elif[ -b ${FILE} ]thenecho \"Its a block file!\"elif[ -c ${FILE} ]thenecho \"Its a character file!\"elif[ -s ${FILE} ]thenecho \"Its a socket file!\"elif[ -p ${FILE} ]thenecho \"Its a pipe file!\"fi
16.编写脚本checkint.sh判断用户输入的参数是否为正整数
read -p \"Please input the number:\" NUMif# [ -n \"`echo ${NUM} |sed \'s/[0-9]/g/\'`\" ] && [ ${NUM} -gt 0 ][[ ${NUM} =~ ^([0-9]+)$ ]] && [ ${NUM} -gt 0 ]thenecho \"The number is positive int\"elseecho \"The number is not positive int\"fi~
17.编写脚本reset.sh,实现系统安装后的初始化环境,包括1,别名 2,环境变量,,如PS1等3,安装常用软件包如:tree5,实现固定的IP设置6vim的设置等。
正在完善中。。。
18.程序出错,中断整个脚本
if[ $? -ne 0 ]thenreturn $?
19.利用for循环语句进行一些工作
19.1 判断/var/目录下所有文件的类型
read -p \"please input the directory : \" DIRfor i in `ls ${DIR}`doif[ -b ${DIR}/${i} ]thenecho \"${i} is a block file\"elif[ -c ${DIR}/${i} ]thenecho \"${i} is a character file\"elif[ -f ${DIR}/${i} ]thenecho \"${i} is a normal file\"elif[ -h ${DIR}/${i} ]thenecho \"${i} is a link file\"elif[ -p ${DIR}/${i} ]thenecho \"${i} is a pipe file\"elif[ -d ${DIR}/${i} ]thenecho \"${i} is a directory!\"elif[ -s ${DIR}/${i} ]thenecho \"${i} is a socket file\"fidone
19.2添加10个用户user1-user10,密码为8位随机字符
#!/bin/bashfor i in {1..10}douseradd user${i}pass=`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c 8 `echo ${pass} |passwd --stdinecho ${pass} >> /data/passwd.txtdoneecho \"the user user{i} is created!\"
19.3/etc/rc.d/rc3.d目录下分别分别有多个以k开头和以S开头的文件;分别读取每个文件以k开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
for i in `ls /etc/rc.d/rc3.d`doif[ \"$(echo ${i} |cut -c1)\" == \"S\" ]thenecho -e \"${i} start\"elseecho -e \"${i} stop\"fidone
19.4编写脚本,提示输入正整数n的值,计算1+2+…n的总和
#!/bin/bashread -p \"please input positive int n\" Nfor((sum=0,i=1;i<=${N};sum+=i,i++))dotruedoneecho \"the result is ${sum}\"
19.5计算100以内所有能被3整除的整数之和
#!/bin/bashsum=0for i in {1..100}doif[ $[${i}%3] -eq 0 ]thensum=$[$sum+$i]fidoneecho \"the result is $sum\"
19.6编写脚本,提示请输入网址,如192.168.0.0,判断输入的网段中主机在线的状
read -p \"please input the adress\" ADDRESSifping -c2 -w2 ${ADDRESS} &> /dev/nullthenecho \"${ADDRESS} is up\"elifgrep -q \"${ADDRESS}\" ~/maintenance.txtthenecho \"${ADDRESS} is undergoing maintenance\"elseecho \"station is unexpecedly DOWN!\"fi
19.7打印99乘法表
19.8在/etcdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
mkdir -p /data/num_uradomfor i in {1..10}docd /data/num_urandomtouch ${i}`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c8`.htmldone
19.9打印等腰三角形
for((i=1;i<=9;i++))dofor((j=9;j>=i;j--))doecho -n \" \"donefor((j=2;j<=i;j++))doecho -n \"*\"for((j=1;j<=i;j++))doecho -n \"*\"donedonedone
19.10猴子第一天摘下若干个桃子,当即吃了一半,还不够,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子,求第一天摘了多少桃子。
#!/bin/bashsum=1for ((n=1;n<10;n++));do??sum=$[2*$[$sum+1]]doneecho \"所摘桃子数: $sum\"``
20.利用while实现脚本
20.1编写脚本,求100内所有正奇数之和
20.2编写脚本,提示输入网络地址,如192.168.0.0,判断输入的网段中主机的在线状态,并统计在线和离线主机各有多少
20.3编写脚本,打印9×9乘法表
20.4 编写脚本用变量RANDOM生成10个随机数,输出这10个数字,并显示其中的最大值和最小值。
20.5编写脚本,实现打印国际象棋
for((i=1;i<=8;i++));dofor((j=1;j<=8;j++));dolet sum=(\"$i\"+\"$j\")%2if [ \"${sum}\" -eq 1 ];thenecho -ne \"\\033[1;43m \\033[0m\"elseecho -ne \"\\033[1;47m \\033[0m\"fidoneechodone
20.6后续六个字符串:efbaf257cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo$RANDOM|md5sum|cut -c1-10后的结果,请破解这些字符对应的RANDOM值。
21.每隔三秒钟到系统上获取已经登录的用户信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本
until who |grep -q \'^panda\' ;dosleep 3donewho |grep \'^hacker\' |tr -s \' \' |cut -d \' \' -f1,3,5 >>/var/log/login.logecho \"日志信息已记录\"
22 . 用文件名做参数,统计所有参数文件的总行数
read -p \"Please input a little filename: \" FILESwhile [ -n \"$FILES\" ];doecho -e \"\\033[1;33m lines are `cat $FILES |wc -l` \\e[0m\"breakdone
23.用两个以上的数字为参数,显示其中的最大值和最小值。
两个数字比较:
if [ $# -ne 2 ];thenecho -e \"\\033[1;31m input two number at least!!! \\033[0m\"elif [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]];thenif [ $1 -lt $2 ];thenecho \"the largest number is \\$2:$2 ,the less number is \\$1:$1\"elif [ $1 -gt $2 ];thenecho \"the largest number is \\$1:$1 ,the less number is \\$2:$2\"elseecho \"two number is queal\"afielseecho -e \"\\033[1,31m please input number!!!\\33[0m\"fi
大于两个数字以上:
24.编写函数,实现os的版本判断
25.编写函数,实现取出当前系统eth0的IP地址
26.编写函实现打印绿色ok和红色failed
27.编写函数,实现判断是否无未知参数,如无参数,提示错误
28.编写函数,实现两个数字作为参数返回最大值
29.编写脚本/root/bin/testsrv.sh完成如下要求
(1)脚本可接受参数:start,stop,restart,status
(2)如果参数非此四者之一,提示使用格式后报错退出
(3)如是start:则创建/var/lock/subsys/SCRIPT_NAME,并显示启动成功
(4)如果是stop:则删除/var/lock/subsys/SCRIPT_NAME,并显示“停止完成”考虑:如果事先已经停止过了,该如何处理?
(5)如果是restart,则先stop,再start,考虑:如果本来没有start,如何处理?
(6)如果是status,则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running …”,如果是/var/locksubsys/SCRIPT_NAME文件不存在,则线回收“SCRIPT_NAME is stopped…”
(7)在所有模式下禁止启动该服务,可用chkconfig和service
命令管理
说明:SCRIPT_NAME为当前脚本
30.编写脚本/root/bin/copycmd.sh
(1)提示用户输入一个可执行命令名称
(2)获取此命令所依赖的所有库文件列表
(3)复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如: /bin/bash==>/mnt/sysroot/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退出。
(5)