#!/bin/bash # 微信公众号skywdie # 程序开发作者skywide # 定义函数名slFunlocalyum配置本地yum源函数 # 定义函数名slFunnetwork查看网络信息 # **** Shell脚本运维编程考查 **** # # 功能需求 # 编写Shell脚本,实现运维常用工具箱,能够根据用户输入的菜单项执行相应功能,具体支持如下功能: # (1)查看系统信息,包括:内核版本、Linux发行版本、内存信息、CPU信息、磁盘信息、IP地址等信息。 # (2)一键配置网络IP地址(ip、掩码、网关、dns由用户输入),并输出配置好之后的IP地址信息。 # (3)一键配置本地YUM源,并输出配置好之后的repolist信息。 # (4)一键关闭并永久关闭防火墙与SELinux。 # 自适应模块编写 # 对系统版本号进行自适应模块设计。 #<-------------------------------------------------主函数调用全局函数 main(){ TTTT whether while : do ToolboxMenu #<-----------------------系统选项菜单函数 read -p "Please enter your choice![1..8]" number case $number in 1) #<-----------------------yum源配置函数 slFunlocalyum ;; 2) #<-----------------------网络配置函数 slFunnetwork ;; 3) #<-----------------------查看系统信息函数 slFunsystemin ;; 4) #<-----------------------一键关闭防火墙和selinux函数 ;; 5) #<-----------------------检验linux安全启动项 selinux ;; 6) #<-----------------------调用python函数 pythonfunction ;; 7) #<-----------------------待开发 ;; 8) #<-----------------------其他功能函数 Function ;; *) #<-----------------------待开发或设定为exit退出函数 exit ;; esac done } #<-------------------------------------------------判断是否需要工具箱服务 function whether () { read -p "Continue to use[y],sign out[n]:" play if [[ "$play" == "y" ]];then clear else echo "Thank you for your use. Have a nice day!";exit fi } #<-------------------------------------------------menu bar function ToolboxMenu(){ echo -e "\033[5;34m ===========This is a system detection toolbox====================\033[0m" echo -e "\033[33m | 1.yum source configuration options | \033[0m" echo -e "\033[33m | 2.Network Configuration options | \033[0m" echo -e "\033[33m | 3.View system information | \033[0m" echo -e "\033[33m | 4.One key to close the firewall and selinux | \033[0m" echo -e "\033[33m | 5.Viewing process information | \033[0m" echo -e "\033[33m | 6.call python function | \033[0m" echo -e "\033[33m | 7.Other function boxes | \033[0m" echo -e "\033[33m | 8.Exit Toolbox | \033[0m" echo -e "\033[33m | Current Time:$(date "+%Y-%m-%d %H:%M:%S") welcome!!engineer! | \033[0m" echo -e "\033[5;34m ===========System detection toolbox==============================\033[0m" } #<-------------------------------------------------Submenu bar function TToolboxMenu () { echo -e "\033[5;34m ========This is a anython detection toolbox============\033[0m" echo -e "\033[33m | 1.查看磁盘挂载信息 | \033[0m" echo -e "\033[33m | 2.查看内存信息 | \033[0m" echo -e "\033[33m | 3.查看CPU信息 | \033[0m" echo -e "\033[33m | 4.查看网络端口信息 | \033[0m" echo -e "\033[33m | 5.查看进程信息 | \033[0m" echo -e "\033[33m | 6.磁盘每秒进程下的I0读写数量 | \033[0m" echo -e "\033[33m | 7.Exit Toolbox | \033[0m" echo -e "\033[33m | Current Time:$(date "+%Y-%m-%d %H:%M:%S") welcome!!engineer! |\033[0m" echo -e "\033[5;34m =============System detection toolbox=================\033[0m" } #<------------------------------------------------- # (1)一键配置本地YUM源,并输出配置好之后的repolist信息。 function slFunlocalyum(){ echo -e "\033[5;34m =============欢迎进入yum源配置工具=================\033[0m" read -p "光盘是否已连接(y/n)" a case $a in y) read -p "选择网络1或者本地yum源2" netlocal case $netlocal in 1) echo "正在配置网络yum源中" echo "正在再次验证网络环境" ping -c5 www.baidu.com &> /dev/null echo "网络检验通过" if [ $? -eq 0 ]; then mount /dev/sr0 /mnt &> /dev/null mkdir -p /etc/yum.repos.d/repo.bak mv /etc/yum.repos.d/* /etc/yum.repos.d/repo.bak &> /dev/null wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null "yum clean all && yum makecache" &> /dev/null echo "在线yum源已配置完成" yum repolist else echo "网络环境有问题,请检查后再使用网络yum源配置选项" fi ;; 2) echo "正在配置本地yum源中" mount /dev/sr0 /mnt &> /dev/null mkdir -p /etc/yum.repos.d/repo.bak mv /etc/yum.repos.d/* /etc/yum.repos.d/repo.bak &> /dev/null echo '[local] name=local baseurl=file:///mnt enabled=1 gpgcheck=0' > /etc/yum.repos.d/local.repo "yum clean all && yum makecache" &> /dev/null echo "本地yum源已配置完成" yum repolist ;; esac ;; n) echo "请连接光盘再执行该脚本" ;; *) echo "错误命令无法识别" esac } #<------------------------------------------------- # (2)一键配置网络IP地址(ip、掩码、网关、dns由用户输入),并输出配置好之后的IP地址信息。 function slFunnetwork(){ echo -e "\033[5;34m =============欢迎进入网络配置工具=================\033[0m" read -p "是否需要一键配置网络(y/n)" ipsl case $ipsl in y) echo "启动配置" read -p "1,选择配置全新网络配置文件或2,(正在开发)选择在已有文件修改配置项" choose case $choose in 1) touch netowrk.sh #创建文件network.sh vi network.sh #进入命令界面 i #进入编辑 uuid=`uuidgen eth1` ####获取uuid MAC=`ip addr | grep link/ether` ###获取到写着mac的这一行 mac=`echo ${MAC:15:17}` ###获取到准确mac echo "配置网络" echo "请输入您要设定的IP地址" ###获取到键盘输入的值,赋给:变量 read -p '请输入IP:' IP read -p '请输入DNS:' DNS read -p '请输入子网掩码:' NETMASK read -p '请输入网关:' GATEWAY echo $IP ###显示一下所配IP network_settings ###调用函数 echo "namesever "$DNS"" >>/etc/resolv.conf ###将DNS写入解析 service network restart ###重启网络服务 echo "网络配置成功" :wq # ESC:wq ##保存退出 bash network.sh ###运行 systemctl restart network #重启网络 ;; 2) echo "请确定网络配置文件位置" read -p "配置文件路径:" netfile lu=`cd $netfile` read -p "是否(y/n)需要文件备份以防文件配置错误崩溃" fileerror case $fileerror in y) echo "正在开始准备备份" read -p "选择备份文件路径:" netfileb cp `$netfile` `$netfileb+.bac` ;; n) echo "不进行备份选择!!!\n" ;; esac `cat $netfile` IP=192.168.89.15 #这个是IP NETMASK=255.255.255.0 #这个是子网掩码 GATEWAY=192.168.89.1 #这个是网关 DNS=202.117.128.2 #这个是DNS DNS_DIR=/etc/resolv.conf #DNS文件路径 IP_DIR=/etc/network/interfaces #网卡配置文件路径 LOOP=”iface lo inet loopback” ETH0=”iface eth0 inet static” if [ $# -eq 4 ]; then IP=$1;NETMASK=$2;GATEWAY=$3;DNS=$4; #如果带4个参数运行 elif [ $# -eq 1 ]; then IP=$1; #如果带1个参数运行 elif [ $# -eq 0 ] ;then echo “You use default configure” #如果不带参数运行 else #错误的使用方式,打印使用方法 echo “ERR ARGUMENT,Follow is right:” echo “./config_net.sh IP NETMASK GATEWAY DNS” echo “(OR)./config_net.sh IP” echo “(OR)./config_net.sh” exit fi #将配置写入到网卡配置文件中 echo “auto lo ${LOOP} ${ETH0} address ${IP} netmask ${NETMASK} gateway ${GATEWAY} auto eth0″>${IP_DIR} #将配置写入到DNS文件中 echo “nameserver ${DNS}”>${DNS_DIR} #重启网络 /etc/init.d/networking restart ;; esac ;; n) echo "正在退出配置功能" ;; *) echo "命令错误" ;; esac } function network_settings(){ echo "TYPE=Ethernet" >/etc/sysconfig/network-scripts/ifcfg-ens33 #'>'表示覆盖 echo "BOOTPROTO=static" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "DEFROUTE="yes"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 #其他的>>表示追加 echo "PEERDNS="yes"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "PEERROUTES="yes"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV4_FAILURE_FATAL="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6INIT="yes"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6_AUTOCONF="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6_DEFROUTE="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6_PEERDNS="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6_PEERROUTES="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPV6_FAILURE_FATAL="no"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "NAME="ens33"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "HWADDR=$mac" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "UUID="$uuid"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "DEVICE="ens33"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "ONBOOT="yes"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "IPADDR="$IP"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "GATEWAY="$GATEWAY"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "NETMASK="$NETMASK"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 echo "DNS="$DNS"" >>/etc/sysconfig/network-scripts/ifcfg-ens33 } #<------------------------------------------------- # (1)查看系统信息,包括:内核版本、Linux发行版本、内存信息、CPU信息、磁盘信息、IP地址等信息。 function slFunsystemin(){ read -p "查看系统信息,包括:内核版本、Linux发行版本、内存信息、CPU信息、磁盘信息、IP地址等信息" shellsystem case $shellsystem in 1) #内核版本 `cat /proc/version` ;; 2) #linux发行版本 `cat /etc/issue` ;; 3) #cup信息 `cat /proc/cpuinfo` ;; 4) echo "查看所有信息" date=`date +"%Y-%m-%d %H:%M:%S"` user=`who -H` hostname=`hostname` ip=`ifconfig | awk 'NR==2 {print $2}'` system=`cat /etc/redhat-release` cpu=`lscpu` memory=`free -h` disk=`df -h` running_time=`uptime` login_user=`last -n 10` firewall=`systemctl status firewalld.service | awk 'NR==3 {print $2}'` selinux=`cat /etc/sysconfig/selinux | awk 'NR==7 {print $1}'` echo "----------------------- 时间:$date 系统用户: $user 主机名:$hostname 主机IP:$ip 系统类型:$system cpu属性: $cpu 内存信息: $memory 硬盘信息: $disk 运行时间:$running_time 最近十个登录用户: $login_user 防火墙状态:$firewall selinux状态:$selinux ;; 5) #内存使用 echo -e "\033[5;34m ============Memory usage============\033[0m" free -h n=1 for i in {1..3} do echo -e "\033[5;34m ============Memory usage${n}============\033[0m" vmstat | awk '{if(NR==3){print "You have free memory left:" $4}}' let ++n sleep 1 done whether esac } #<------------------------------------------------- #(4)一键关闭并永久关闭防火墙与SELinux。 function selinux(){ echo "欢迎进入linux安全防护设置" read -p "1一键永久关闭防火墙与selinux,\n2一键临时关闭防火墙与selinux,\n3一键开启防火墙与selinux" liself case $liself in 1) echo "已经永久关闭防火墙与selinux" systemctl disable firewalld.service vi /etc/sysconfig/selinux i echo "SELINUX=disabled" >>/etc/sysconfig/selinux :wq sestatus getenforce read -p "永久关闭selinux需要重启电脑(1确认重启/2拒绝重启)" se if [ $se == 1 ] then reboot #重启电脑 else echo "拒绝重启" fi ;; 2) systemctl stop firewalld setenforce 0 echo "已经临时关闭firewalld与selinux" sestatus ;; 3) echo "检查firewalld与selinux状态" systemctl status firewalld sestatus systemctl start firewalld setenforce 1 systemctl status firewalld sestatus ;; 4) ;; 5) ;; esac } function Function(){ #<----------------邀请用户输入需要检测的信息 echo "欢迎进入其他功能" while : do TToolboxMenu read -p "Please enter your choice![1..7]" number case $number in #<-----------------------------------------------------------磁盘挂载信息 1) echo -e "\033[5;34m ============Partition information${z}============\033[0m" df -hT whether ;; #<------------------------------------------------------内存使用情况 2) echo -e "\033[5;34m ============Memory usage============\033[0m" free -h n=1 for i in {1..3} do echo -e "\033[5;34m ============Memory usage${n}============\033[0m" vmstat | awk '{if(NR==3){print "You have free memory left:" $4}}' let ++n sleep 1 done whether ;; #<-------------------------------------------------------CPU利用率和负载 3) v=1 for i in {1..3} do echo -e "\033[5;34m ============CPU usage${v}===========\033[0m" uptime vmstat | grep 2 |awk '{if (100-$15<=10){print 100-$15 "%","您的CPU很安全"}else{print 100-$15 "%","您的CPU即将满载请留意"}}' let ++v sleep 1 done whether ;; #<---------------------------------------------------------------网络端口信息 4) while : do echo -e "\033[5;34m ============Network port information============\033[0m" read -p "Please enter the network port number you want to query:" Port netstat -anpt | head -2 netstat -anpt | grep $Port read -p "Do you want to check the port?[y/n]" see if [[ ! $see == "y" ]];then echo "Thank you for your use. Have a nice day!";exit else break fi done whether ;; #<----------------------------------------------------------------进程信息查询 5) echo -e "\033[5;34m ============Process information============\033[0m" read -p "Please enter the process information you want to query:" Process ps aux | grep -v grep |grep $Process whether ;; #<-------------------------------------------磁盘每秒进程下的IO读、写请求数量 6) b=1 for i in {1..3} do echo -e "\033[5;34m ============Number of IO read / write requests issued by the process${b}============\033[0m" iostat | grep ^sd | awk '{print $1,$2}' let ++b sleep 1 done whether ;; #<---------------------------------退出 7) echo -e "\033[36 Thank you for your use. Have a nice day!\033[0m" exit ;; #<------------------没有匹配项重新显示菜单 *) echo -e "\033[31m Error redirecting to menu for you ! \033[0m" ;; esac done #script end } function pythonfunction(){ echo 'sss' python pythonfun.py } function TTTT(){ trap 'onCtrlC' INT function onCtrlC () { #捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程 kill -9 ${do_sth_pid} ${progress_pid} echo echo 'Ctrl+C is captured' exit 1 } do_sth() { #运行的主程序 echo "运行环境自检" ping -c 4 www.baidu.com echo "网络环境良好" } progress() { #进度条程序 local main_pid=$1 local length=20 local ratio=1 while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do mark='>' progress_bar= for i in $(seq 1 "${length}"); do if [ "$i" -gt "${ratio}" ] ; then mark='-' fi progress_bar="${progress_bar}${mark}" done printf "正在进入: ${progress_bar}\r" ratio=$((ratio+1)) #ratio=`expr ${ratio} + 1` if [ "${ratio}" -gt "${length}" ] ; then ratio=1 fi sleep 0.1 done } do_sth & do_sth_pid=$(jobs -p | tail -1) progress "${do_sth_pid}" & progress_pid=$(jobs -p | tail -1) wait "${do_sth_pid}" printf "Progress: done \n" } main