练习:
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核
版本,CPU型号,内存大小,硬盘大小
1#!/bin/bash 2YELLOW='\e[1;33m' 3RED='\e[1;31m' 4END='\e[0m' 5 6echo -e "${YELLOW}++++++++++++++++++++++++++++++++++++++++++${END}" 7echo -e "${RED}HOSTNAME: `hostname`${END}" 8echo -e "${RED}IPADDR: `hostname -I`${END}" 9echo -e "${RED}OS's version: `cat /etc/centos-release`${END}" 10echo -e "${RED}Kernel version: `uname -r`${END}" 11echo -e "${RED}CPU: `lscpu |egrep '^Model name'|tr -s ' '|cut -d: -f2`${END}" 12echo -e "${RED}Memory size: `free -h|sed -rn '2p'|tr -s ' '|cut -d' ' -f2`${END}" 13echo -e "${RED}Disk size: `lsblk |sed -n '2p'|egrep -o '([0-9]+)G'`${END}" 14echo -e "${YELLOW}++++++++++++++++++++++++++++++++++++++++++${END}"
2、编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd中
版本1:
1#!/bin/bash 2RED='\e[1;31m' 3GREEN='\e[1;32m' 4END='\e[0m' 5SOURCE="/etc" 6DEST="/backup" 7 8[ ! -d $DEST ] && { mkdir $DEST;echo -e "${RED}Start backup...${END}";sleep 3;cp -av $SOURCE $DEST/etc`date +%F`;echo -e "${GREEN}Back is finished.${END}"; } || { echo -e "${RED}Start backup...${END}";sleep 3;cp -av $SOURCE $DEST/etc`date +%F`;echo -e "${GREEN}Back is finished.${END}"; }
版本2:
1#!/bin/bash 2RED='\e[1;31m' 3GREEN='\e[1;32m' 4END='\e[0m' 5SOURCE="/etc" 6DEST="/backup" 7 8if [ ! -d $DEST ];then 9 mkdir $DEST 10 echo -e "${RED}Start backup...${END}" 11 sleep 3 12 cp -av $SOURCE $DEST/etc`date +%F` 13 echo -e "${GREEN}Back is finished.${END}" 14else 15 echo -e "${RED}Start backup...${END}" 16 sleep 3 17 cp -av $SOURCE $DEST/etc`date +%F` 18 echo -e "${GREEN}Back is finished.${END}" 19fi
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
1#!/bin/bash 2COLOR='\e[1;36m' 3END='\e[0m' 4MAX=`df|egrep '^/dev/sd'|egrep -o '([0-9]+)%' |tr -d '%'|sort -nr|head -1` 5 6echo -e "${COLOR}The maximum value of space is $MAX in the hard disk partition.${END}"
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排
序
1#!/bin/bash 2COLOR='\e[1;34m' 3END='\e[0m' 4RESULT=`netstat -tan|egrep 'ESTABLISHED'|tr -s ' ' :|cut -d: -f6|sort|uniq -c|sort -nr` 5 6echo -e "${COLOR}Active Internet connections's status:\n${RESULT}${END}"
1、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给
一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
版本1:
1#!/bin/bash 2[ $# -lt 1 ] && { echo -e "\e[1;31mPlease at least give an argument.\e[0m";exit 2; } 3[ $# -ge 1 ] && echo -e "\e[1;35mBlank lines is `grep '^$' $1 $2 $3|wc -l`.\e[0m"
版本2:
1#!/bin/bash 2if [ $# -lt 1 ];then 3 echo -e "\e[1;31mPlease at least input a filename as an argument.\e[0m" 4 exit 2 5else 6 echo -e "\e[1;36mBlank line is `egrep '^$' $1 $2 $3 | wc -l`.\e[0m" 7fi
2、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提
示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
版本1:
1#!/bin/bash 2IP=10.0.0.7 3RED='\e[1;31m' 4GREEN='\e[1;32m' 5ping -c1 -W1 $IP &> /dev/null && echo -e "${GREEN}${IP} is up.${END}" || echo -e "${RED}${IP} is down.${END}"
版本2:
1#!/bin/bash 2RED='\e[1;31m' 3GREEN='\e[1;32m' 4END='\e[0m' 5IP=10.0.0.2 6if ping -c1 -W1 $IP &> /dev/null;then 7 echo -e "${GREEN}${IP} is up.${END}" 8else 9 echo -e "${RED}${IP} is down.${END}" 10fi
版本3:
1#!/bin/bash 2IP=10.0.0 3RED='\e[1;31m' 4GREEN='\e[1;32m' 5END='\e[0m' 6 7for i in `seq 254`;do 8 ping -c1 -W1 ${IP}.${i} &> /dev/null && echo -e "${GREEN}${IP}.${i} is up.${END}" || echo -e "${RED}${IP}.${i} is down.${END}" 9done
3、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将
满
版本1:
1#!/bin/bash 2WARN=20 3GREEN='\e[1;32m' 4END='\e[0m' 5SPACE_USED=`df|egrep '^/dev/sd'|egrep -o '([0-9]+)%' |tr -d '%'|sort -nr|head -1` 6INODE_USED=`df -i|egrep '^/dev/sd'|egrep -o '([0-9]+)%' |tr -d '%'|sort -nr|head -1` 7 8[ $SPACE_USED -ge $WARN -o $INODE_USED -ge $WARN ] && echo "space will be full." | mail -s diskwarning 123456789@qq.com || echo -e "${GREEN}Disk space is enough.${END}"
版本2:
1#!/bin/bash 2WARN=20 3YELLOW='\e[1;33m' 4END='\e[0m' 5DISK_USED=`df|egrep '/dev/sd'|egrep -o '([0-9]+)%'|tr -d '%'|sort -nr|head -1` 6INODE_USED=`df -i|egrep '^/dev/sd'|egrep -o '([0-9]+)%' |tr -d '%'|sort -nr|head -1` 7 8if [ $DISK_USED -ge $WARN -o $INODE_USED -ge $WARN ];then 9 echo "Disk space will be full." |mail -s Diskwarning 123456789@qq.com 10else 11 echo -e "${YELLOW}Disk space is enough.${END}" 12fi
版本3:
1#!/bin/bash 2WARN=10 3RED='\e[1;31m' 4BLUE='\e[1;34m' 5END='\e[0m' 6 7DISK_USED=`df|egrep '^/dev/sd'|egrep -o '([0-9]+)%' |tr -d '%'` 8 9for i in $DISK_USED;do 10 [ $i -ge $WARN ] && echo -e "${RED}Disk space will be full.${END}" || echo -e "${BLUE}Disk space is enough.${END}" 11done
4、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
版本1:
1#!/bin/bash 2read -p "Please input a filename: " FILE 3[ ! -r $FILE -a ! -w $FILE ] && echo "$FILE is not readable and not writeable" || echo "$FILE is readable or writeable."
版本2:
1#!/bin/bash 2COLOR1='\e[1;33m' 3COLOR2='\e[1;34m' 4END='\e[0m' 5if [ $# -ne 0 ];then 6 [ ! -r $1 -a ! -w $1 ] && echo -e "${COLOR1}$1 is not readable and not writeable.${END}" || echo -e "${COLOR2}$1 is readable or writeable.${END}" 7else 8 echo -e "${COLOR1}Please input a file.${END}" 9fi
5、编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,
否则提示用户非脚本文件
版本1:
1#!/bin/bash 2RED='\e[1;31m' 3YELLOW='\e[1;33m' 4END='\e[0m' 5read -p "Please input a filename: " FILE 6[[ "$FILE" =~ ^.*\.sh$ ]] && { chmod a+x $FILE;echo -e "${YELLOW}${FILE}'s executeable is added.${END}"; } || echo -e "${RED}${FILE} is not a script file.${END}"
版本2:
1#!/bin/bash 2RED='\e[1;31m' 3YELLOW='\e[1;33m' 4END='\e[0m' 5read -p "Please input a filename: " FILE 6if [[ "$FILE" =~ ^.*\.sh$ ]];then 7 chmod a+x $FILE 8 echo -e "${YELLOW}${FILE}'s executeable permission is added.${END}" 9else 10 echo -e "${RED}${FILE} is not a script file.${END}" 11fi
6、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统
版本1:
1#!/bin/bash 2YELLOW='\e[1;33m' 3END='\e[0m' 4FILE="/etc/nologin" 5 6[ ! -e $FILE ] && { touch $FILE; echo -e "${YELLOW}Prohibit common user login.${END}"; } || echo -e "${YELLOW}Cmmon user can not login.${END}"
版本2:
1#!/bin/bash 2YELLOW='\e[1;33m' 3RED='\e[1;31m' 4END='\e[0m' 5FILE="/etc/nologin" 6 7if [ ! -e $FILE ];then 8 touch $FILE 9 echo -e "${YELLOW}Prohibit common user login.${END}" 10else 11 echo -e "${RED}Cmmon user can not login.${END}" 12fi
练习
1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
1echo "export PATH=/usr/local/apache/bin:$PATH" >> /etc/profile 2source /etc/profile 3echo $PATH
2、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm -i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是
CentOS7)
1echo PS1="\[\e[1;32m\][\[\e[0m\]\[\e[1;32m\]\u\[\e[32m\]@\h\[\e[1;32m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ " >> /etc/profile.d/env.sh 2cat <<EOF >> ~/.bashrc 3>rm='rm -i' 4>cdnet='cd /etc/sysconfig/network-scripts/' 5>editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0' 6>EOF
3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
echo -e "\e[1;31mHi,dangerous!\e[0m" >> /etc/motd
4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
1vim ~/.vimrc 2set ts=2 3set expandtab 4set ignorecase 5set autoindent 6autocmd BufNewFile *.sh exec ":.call SetTitle()" 7func SetTitle() 8if expand("%:e") == 'sh' 9 call setline(1,"#!/bin/bash") 10 call setline(2,"#***********************************************") 11 call setline(3,"#Author: Kingdom_xu") 12 call setline(4,"#Mail: 123456789@qq.com") 13 call setline(5,"#Version: 1.0") 14 call setline(6,"#Date: ".strftime("%Y-%m-%d")) 15 call setline(7,"#FileName: ".expand("%")) 16 call setline(8,"#Description: The test script") 17 call setline(9,"#Copyright (C): ".strftime("%Y")." All rights reserved") 18 call setline(10,"#***********************************************") 19 call setline(11,"") 20endif 21endfunc 22autocmd BufNewFile * normal G
练习
1、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就
显示其存在,否则添加之。并设置初始密码为123456,显示添加的用户的id号等信息,在此新用户第一
次登录时,会提示用户立即改密码,如果没有参数,就提示:请输入用户名
版本1:
1#!/bin/bash 2read -p "Please input a username: " NAME 3 4[ -z $NAME ] && { echo -e "\e[1;33mPlease give a username.\e[0m";exit 2; } 5id $NAME &> /dev/null && { echo -e "\e[1;36m$NAME is exist.\e[0m"; } || { useradd $NAME;echo $NAME:123456 | chpasswd $NAME;getent passwd $NAME;passwd -e $NAME &> /dev/null; }
版本2:
1#!/bin/bash 2read -p "Please input a username: " NAME 3 4if [ -z $NAME ];then 5 echo -e "\e[1;37mInput a username.\e[0m" 6 exit 2 7fi 8 9if getent passwd $NAME;then 10 echo -e "\e[1;32m$NAME is exist.\e[0m" 11else 12 useradd $NAME 13 echo $NAME:123456 | chpasswd $NAME 14 id $NAME 15 passwd -e $NAME &> /dev/null 16fi
2、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
1#!/bin/bash 2read -p "Please input yes or no: " ANS 3 4case $ANS in 5[Yy]|[Yy][Ee][Ss]) 6 echo -e "\e[1;34mYour answer is YES.\e[0m" 7 ;; 8[Nn]|[Nn][Oo]) 9 echo -e "\e[1;35mYour answer is NO.\e[0m" 10 ;; 11*) 12 echo -e "\e[1;33mPlease input yse or no.\e[0m" 13esac
3、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类
型)
1#!/bin/bash 2read -p "Input a filename: " FILE 3TYPE=`ls -ld $FILE|egrep -o '^.'` 4 5case $TYPE in 6-) 7 echo -e "\e[1;31m$FILE is a normal file.\e[0m" 8 ;; 9d) 10 echo -e "\e[1;32m$FILE is a directory file.\e[0m" 11 ;; 12l) 13 echo -e "\e[1;33m$FILE is a link file.\e[0m" 14 ;; 15b) 16 echo -e "\e[1;34m$FILE is a block file.\e[0m" 17 ;; 18c) 19 echo -e "\e[1;35m$FILE is a character file.\e[0m" 20 ;; 21s) 22 echo -e "\e[1;36m$FILE is a socket file.\e[0m" 23 ;; 24p) 25 echo -e "\e[1;37m$FILE is a pipe file.\e[0m" 26 ;; 27*) 28 echo -e "\e[1;31m$FILE is other type file.\e[0m" 29esac
4、编写脚本 checkint.sh,判断用户输入的参数是否为正整数
1#!/bin/bash 2read -p "Please input a digit: " NUM 3 4[[ "$NUM" =~ ^[0-9]+$ ]] && echo -e "\e[1;32m$NUM is a positive integer.\e[0m" || echo -e "\e[1;31m$NUM is not a positive integer.\e[0m"
5、编写脚本 reset.sh,实现系统安装后的初始化环境,包括:1、别名 2、环境变量,如PS1等 3、
安装常用软件包,如:tree 5、实现固定的IP的设置,6、vim的设置等
1#!/bin/bash 2echo -e "\e[1;31mThis is a system initialization script.\e[0m" 3echo -e "\e[1;$[RANDOM%7+31]m" 4cat <<EOF 51)禁用SElinux、防火墙 62)安装常用软件包 73)更改yum源 84)修改网卡名和静态地址 95)别名 106)vim设置 117)输入错误,重新选择 12EOF 13echo -e "\e[0m" 14 15read -p "Please choose a option from menu(1-6): " MENU 16case $MENU in 171) 18 echo -e "\e[1;31mStarting turn off SElinux and Firewalld.\e[0m" 19 egrep '^SELINUX=' /etc/selinux/config |sed -i 's/enforcing/disabled/' &> /dev/null 20 setenforce 0 &> /dev/null 21 systemctl stop firewall &> /dev/null 22 systemctl disable --now firewall &> /dev/null 23 echo -e "\e[1;31mTurned off SElinux and firewalld finished.\e[0m" 24 ;; 252) 26 echo -e "\e[1;32mStarting install many packages.\e[0m" 27 yum -y install wget vim net-tools 28 yum -y install psmisc tree bc 29 echo -e "\e[1;32mInstall packages finished.\e[0m" 30 ;; 313) 32 echo -e "\e[1;33mStarting update yum resource.\e[0m" 33 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repio &> /dev/null 34 yum makecache &> /dev/null 35 echo -e "\e[1;33mUpdate yum resource finished.\e[0m" 36 ;; 374) 38 DIR="/etc/sysconfig/network-scripts" 39 echo -e "\e[1;34mStarting modify network configure.\e[0m" 40 nmcli connection add type ethernet con-name eth0 ifname ens160 &> /dev/null 41 nmcli connection delete ens160 &> /dev/null 42 sed -i 's/ens160/eth0/g' $DIR/ifcfg-eth0 &> /dev/null 43 sed -i 's/dhcp/static/' $DIR/ifcfg-eth0 &> /dev/null 44 sed -i '/^GRUB_CMDLINE_LINUX=/s/"$/ net.ifnames=0"/' /etc/default/grub &> /dev/null 45 grub2-mkconfig -o /boot/grub2/grub.cfg &> /dev/null 46 echo "IPADDR=10.0.0.8\nPREFIX=24\nGATEWAY=10.0.0.2" >> $DIR/ifcfg-eth0 47 echo -e "\e[1;34mModified network configure finished.\e[0m" 48 ;; 495) 50 echo -e "\e[1;35mStarting define alias name.\e[0m" 51 alias rm='cp -a /etc /data' 52 alias cdnet='cd /etc/sysconfig/network-scripts' 53 alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0' 54 echo -e "\e[1;35mDefined alias name finished.\e[0m" 55 ;; 566) 57 echo -e "\e[1;36mStarting configure ~/.vimrc file.\e[0m" 58 cat /data/vimrc.txt > ~/.vimrc 59 echo -e "\e[1;37mConfigure ~/.vimrc finished.\e[0m" 60 ;; 61*) 62 echo -e "\e[1;31mInvalid option,please choose again.\e[0m" 63 ;; 64esac