计算机网络基础&shell脚本

目录

1、网络层次 

n、抓包、wireshark

1.1 OSI七层

1.2、TCP/IP 

1.3  IP地址、子网掩码、网络号、主机号、网络地址

2、输出>/dev/null 2>&1

n、shell脚本

3、shell案例


1、网络层次 

n、抓包、wireshark

wirshark抓包

1.1 OSI七层

--应用层:人机交互的接口,提供网络服务。

--表示层:1、数据的表示【将用户的操作翻译成计算机能识别的二进制,或者计算机的二进制转换成用户可以识别的数据,如声音、图片】
2、加密【对称加密与非对称加密】、压缩。

--会话层:建立和维持会话。确定需要是否进行网络传递,如果是则给传输层【界面】,不是则本地进行处理【文档】,从而进行分流。

--传输层:是OSI中最重要,最关键的一层,是唯一负责总体的数据传输和数据控制传输层的一层。定义端到端的连接。1、对数据报文进行分组【发送时】与组装【接收时】,【IPV4协议规定,数据包大小<2^16字节】。
2、传输协议的选择,打数据报文头,
    TCP传输控制协议:可靠、面向连接的传输协议,慢【网页,邮件】
    UDP用户数据报文协议:不可靠,面向无连接的传输协议,快【视频通话】
3、端口封装
4、差错校验【tcp滑动窗口机制,传过来的数据包会进行差错校验,a-》b    tcp中b接受到的包错了,会给a反馈错误信息。    udp中b接受到的包错了,会直接丢掉】

--网络层:1、IP地址编制。2、路由选择:静态路由;动态路由

--数据链路层:1、写入MAC地址。MAC地址寻址。2、差错校验。

--物理层:1、数据实际传输。2、电气特性定义。【规定传输线中哪几根是干什么的】

OSI7层连接

1.2、TCP/IP 

校验和:做数据校验的

标准子网掩码【标准子网,默认不写】:
    C类:/24
    B类:/16
    A类:/8

有效子网:在0和1 都有的那一段8位数,就是有效子网

 

1.3  IP地址、子网掩码、网络号、主机号、网络地址

IP地址、子网掩码、网络号、主机号、网络地址

 

 

 

 

2、输出>/dev/null 2>&1

0:表示键盘输入(stdin)
1:表示标准输出(stdout),系统默认是1
2:表示错误输出(stderr)


    command >/dev/null 2>&1 &  == command 1>/dev/null 2>&1 &


1)command:表示shell命令或者为一个可执行程序
2)>:表示重定向到哪里
3)/dev/null:表示Linux的空设备文件
4)2:表示标准错误输出
5)&1:&表示等同于的意思,2>&1,表示2的输出重定向等于于1
6)&:表示后台执行,即这条指令执行在后台运行

 

1>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。


    这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放            
    到/dev/null文件,也就是清空.
    所以可以看出" >/dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。

将正确输出和错误输出都重定向到pwd.log日志中。

    [root@li1544-92 ~]# pdwd > pwd.log 2>&1
    [root@li1544-92 ~]# cat pwd.log 
    -bash: pdwd: command not found

command > /dev/null 2>&1
    通过以上三部分介绍该语句的函数就是将标准输出和标准错误输出重定向到伪设备/dev/null,它的作用    
    就是执行某个命令将不会有任何日志输出。

n、shell脚本

shell脚本

//进制转换 注释
	#!/bin/bash
	echo "The # here does not begin a comment."
	echo 'The # here does not begin a comment.'
	echo The \# here does not begin a comment.
	echo The # 这里开始一个注释
	echo $(( 2#101011 ))     # 数制转换(使用二进制表示),不是一个注释,双括号表示对于数字的处理

	//结果:
	The # here does not begin a comment.
	The # here does not begin a comment.
	The # here does not begin a comment.
	The
	43

//排序符号,&符, if-then-else-fi
	使用分号(;)可以在同一行上写两个或两个以上的命令。只是排序,不具备逻辑判断能力。
	&&,排序加逻辑判断真才执行
	|| 排序加逻辑判断假才执行
	
		[root@localhost profile.d]# ping -c1 www.baidu.com &>/dev/null && echo "up"|| echo "down"
		up

		$ vim test2.sh
		#!/bin/bash
		 echo hello; echo there
		 filename=ttt.sh
		 if [ -e "$filename" ]; then    # 注意: "if"和"then"需要分隔,-e用于判断文件是否存在
			 echo "File $filename exists."; cp $filename $filename.bak
		 else
			 echo "File $filename not found."; touch $filename
		 fi; echo "File test complete."
		 
		 
		#!/bin/bash
		ping -c1 www.baidu.com &>/dev/null && echo "up"|| echo "down"
		/bin/python << EOF
		print "1111"
		EOF

//混合输出
	包括标准输出和错误输出
	xxx &> /dev/null 
	
	
//select循环	select xxx in yyy,zzz,...; do 。。。。 done,一般与case配合
	直观的输出选项菜单yyy,zzz,自动接收输入的参数到$xxx中。从而进行判断
		相关变量:$PS3 设置接收参数的提示信息。
	  1 #!/bin/bash
	  2 PS3="Your choice is[5 for quit]: "
	  while :
	  do
	  3 select choice in disk_partition filesystem cpu_load mem_util quit
	  4 do
	  5         case "$choice" in
	  6                 disk_partition)
	  7                         fdisk -l
								break;;
	  8                 filesystem)
	  9                         df -h
								break;;
	 10                 cpu_load)
	 11                         uptime
								break;;
	 12                 mem_util)
	 13                         free -m
								break;;
	 14                 quit)
	 15                         exit;;
	 16                 *)
	 17                         echo "error"
	 18                         exit
	 19 
	 20         esac
	 21 done
	 done

	
//case-;;-esac 【只能做字符串判断 】
	//建议一个条件判断只做一件事,不要if then 【else】 fi
	#!/bin/bash

	varname=b

	case "$varname" in
		[a-z]) 
			echo "abc"
		;;
		[0-9]) 
			echo "123"
		;;
	esac

//单引号 双引号
	HOME ='111'
	echo $HOME
		111
	echo '$HOME'
		$HOME
	echo "$HOME"
		111
	同样是$HOME,单引号会直接认为是字符,而双引号认为是一个变量,所以有变量或语句要用双引号
	字符串变量最好加上双引号。
	
	//斜杠 反斜杠 
	注意在linux中表示路径的时候,许多个/跟一个/是一样的。/home/shiyanlou等同于home///shiyanlou

	转义符也提供续行功能,也就是编写多行命令的功能。
	每一个单独行都包含一个不同的命令,但是每行结尾的转义符都会转义换行符,
	这样下一行会与上一行一起形成一个命令序列。
	\s  表空格
	\n	表示新的一行【若要在echo中使用要加-e】
	\r	表示回车
	\t	表示水平制表符,tab键
	\v	表示垂直制表符
	\b	表示后退符
	\a	表示"alert"(蜂鸣或者闪烁)
	\0xx	转换为八进制的ASCII码, 等价于0xx
	"	表示引号字面的意思

//反引号``,与$符

	反引号与$中的命令会优先执行,如:
	$ cp `mkdir back` test.sh back
	$ ls

	先创建了 back 目录,然后复制 test.sh 到 back 目录
	
	
	[root@localhost b]# today1=$(date +%F)
	[root@localhost b]# echo $today1
	2022-09-20


//冒号
	//等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。
	“:”命令是一个bash的内建命令,它的退出码(exit status)是(0)。	
	
	#!/bin/bash
	condition=5
	if [ $condition -gt 0 ] #gt表示greater than,也就是大于,同样有-lt(小于),-eq(等于) 
	then :   # 什么都不做,退出分支
	else
		echo "$condition"
	fi

	//在与>重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。
	# : > test.sh   # 文件“test.sh”现在被清空了
	# 与 cat /dev/null > test.sh 的作用相同
	# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
	在与>>重定向操作符结合使用时,将不会对预先存在的目标文件 (: >> target_file)产生任何影响。如果这个文件之前并不存在,那么就创建它。
	也可能用来作为注释行,但不推荐这么做。使用 # 来注释的话,将关闭剩余行的错误检查,所以可以在注释行中写任何东西。然而,使用 : 的话将不会这样。
	$ : This is a comment that generates an error,( if [ $x -eq 3] )
	":"还用来在 /etc/passwd 和 $PATH 变量中做分隔符

	
	
	
//双小括号	小括号 美元符
	//双小括号可以是任意数学赋值或比较表达式,双括号里的大于小于号可以不用转译字符了。
	在括号中的命令列表,将会作为一个子 shell 来运行。
	在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,
	也就是在子shell 中创建的变量。

	//初始化数组
	#!/bin/bash
	arr=(1 4 5 7 9 21)
	echo ${arr[3]} # get a value of arr//7
	
	美元符,变量替换
	
//中括号[  ],括号里要有两个空格
	//条件测试表达式放在[ ]中。双中括号[[ ]]也用作条件测试,和正则表达式,双中括号里少用小括号
		[ 1 -lt 2 -a 1 -lt 2 ]	[ 1 -lt 2 -o 1 -lt 2 ]
		[[ 1 -lt 2 && 1 -lt 2 ]]	[[ 1 -lt 2 || 1 -lt 2 ]]
		
	[] 匹配括号中的任意一个字符 [1-9a-z][A-Z]
	#!/bin/bash
	a=5
	if [ $a -lt 10 ]
	then
		echo "a: $a"
	else
		echo 'a>10'
	fi
	
	//数组元素
	#!/bin/bash
	arr=(12 22 32)
	arr[0]=10
	echo ${arr[0]}
	
//大括号{}
	//复制 t.txt 的内容到 t.back 中,注意: 在大括号中,不允许有空白,除非这个空白被引用或转义。
	{} 集合 {1..9}{a..z}
	#!/bin/bash
	if [ ! -w 't.txt' ];
	then
		touch t.txt
	fi
	echo 'test text' >> t.txt
	cp t.{txt,back}
	
	//代码块,这个结构事实上创建了一个匿名函数(一个没有名字的函数)。然而,与“标准”函数不同的是,
	在其中声明的变量,对于脚本其他部分的代码来说还是可见的。
	
//尖括号
	test.sh > filename:重定向test.sh的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。

	test.sh &> filename:重定向 test.sh 的 stdout(标准输出)和 stderr(标准错误)到 filename 中。

	test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。

	test.sh >> filename:把 test.sh 的输出追加到文件 filename 中。如果filename 不存在的话,将会被创建。

//通配符 注意与正则区分,shell里没有^,
		//条件测试(如数值比较),不一定非要加括号,任何可以返回真假值的都可以作为条件测试。
	* 匹配任意多个字符
	? 匹配任意单个字符
	[  ] 匹配括号中的任意字符,和条件测试表达式
		[^]取反,不匹配括号中的任意字符,[[  ]] 正则表达,里面少用小括号;$[] 整数运算 【注意空格】
	() 在子shell中执行; (()) 数值比较,运算C语言,=,<,>; $() 命令替换,相当于``;$(())整数运算
	{} 集合;函数体; ${} 变量取值,函数结果取值,【echo ${#PATH}】
	
	\ 转义符 转移后面的字符或按键,让其回归本意
		如 \ Enter键,将回车键转译==>就成了换行
			\t		==>			Tab键 【若要在echo中使用要加-e】
			\n		==>			换行符
	
	[root@localhost b]# [ -d /home -a -f /etc/files ];echo $?
	[root@localhost b]# [[ -d /home && -f /etc/files ]];echo $?

		/*(1)单等号和双等号能用于字符string类型和整型integer的相等判断。
		(2)“-eq”仅能用于整型integer的相等比较。
		(3)“-eq”不能在算数运算表达式“(( ))”中
		(4)在条件表达式“[ ]”中,单等号和双等号等价,都是相等算数运算符。
		(5)在算数运算表达式“(( ))”中,单等号是赋值算数运算符,双等号为相等算数运算符。*/


//操作符
	操作符	含义
	-e	判断对象是否存在(Exist),若存在则结果为真
	-d	判断对象是否为目录(Directory),是则为真
	-f	判断对象是否为文件(File),是则为真
	-r	判断对象是否有可读(Read)权限,是则为真
	-w	判断对象是否有可写(Write)权限,是则为真
	-x	对象是否有可执行(eXcute)权限,是则为真
	-n	检测字符串长度是否不为0,//不为0 返回 true。
	-z	检测字符串长度是否为0,//为0返回 true。
	
//变量
	常用变量:
		$LOGNAME	登录的用户名
	read读取
	
		--$0 		当前脚本的名称;
		--$n 		当前脚本的第n个参数,n=1,2,…9;
		--$* 		当前脚本的所有参数(不包括程序本身);把所有的参数看成一个整体
		$@		当前脚本的所有参数(不包括程序本身);$@把每个参数区分对待
		--$# 		当前脚本的参数个数(不包括程序本身);
		--$? 		命令或程序执行完后的状态,返回0表示执行成功;
		$$ 		程序本身的PID号。
		--$! 		上一个后台进程的PID

	[root@localhost b]# export ip2=1.1.1.1
	export 变量名,将变量环境变量化【一般不建议,建议引用其他shell文件】

//运算
	//整数运算
		expr
			[root@localhost ~]# num1=`expr 1 + 2`
			[root@localhost ~]# echo $num1
			3
		-- $(())
			[root@localhost ~]# num2=$((2**3))
			[root@localhost ~]# echo $num2
			8
		$[]
			#echo $[5**2]
		-- let
			#let sum=2+3;echo $sum
			#let i++
	//小数运算
		[root@localhost b]# echo "2.2+2.3"|bc //bc计算器
		4.5
		[root@localhost b]# echo "scale=3;6/4"|bc
		1.500
		[root@localhost b]# awk 'BEGIN{print 1/2}'
		0.5
		[root@localhost b]# echo "print 5.0/2"|python
		2.5

//变量操作

	//变量长度
	[root@localhost b]# url=www.baidu.com
	[root@localhost b]# echo ${#url} 
	13
	//删除
	[root@localhost b]# echo ${url#www.}//从前向后删除部分,最小匹配
	# echo ${url#*.}
	baidu.com
	[root@localhost b]# echo ${url##*.}//从前向后删除部分,贪婪匹配
	com

	[root@localhost b]# echo ${url%.com}//从后向前删除部分,最小匹配
	# echo ${url%.*}
	www.baidu
	[root@localhost b]# echo ${url%%.*}//从后向前删除部分,贪婪匹配
	www

	[root@localhost b]# echo ${url:0:5}//保留:第一个数字为索引值,第二个数字
	www.b
	[root@localhost b]# echo ${url:5:5}
	aidu.
	[root@localhost b]# echo ${url:5}//删除掉到索引值的字符
	aidu.com
	
	//替换
	[root@localhost b]# echo ${url/baidu/qqmail}
	www.qqmail.com
	[root@localhost b]# echo ${url/w/a}
	aww.baidu.com
	[root@localhost b]# echo ${url//w/a}//贪婪匹配
	aaa.baidu.com
	
	//设置默认值
	${变量名-新的变量值} 变量有值【包括空值】则不会被替代,无值则被替代
	${变量名:-新的变量值} 变量有值则不会被替代,无值或空值则被替代
		[root@localhost b]# var1=111
		[root@localhost b]# echo $var1
		111
		[root@localhost b]# unset var1
		[root@localhost b]# echo $var1
		[root@localhost b]# echo ${var1-aaaa}//如果var1不存在,则取默认值
		aaaa
		

	
//正则表达式
	#[[ $i =~ ^[0-9]+$ ]] && echo 1  //注意空格【 =~ 前后】
	=~ 表示的是匹配 && 是前一个命令为真 才执行后一个命令 [[ ]] 是if判断使用正则表达式的固定格式 ^ 是以什么开头 
	[0-9]是表示范围内都是数字 +表示1到多个 $是结尾 ^[0-9]+$ ,就是以数字开头并结尾的 整行都是数字 整句的意思是
	如果 变量$i 匹配到了 以1到多个数字开头并结尾的 那么 就 echo 1
	
	
	
==============================================================================================================
	//引用其他shell文件;引用public.sh文件,从而得到public.sh文件的内容
	   #!/bin/bash
	   . public.sh	【表示当前文件与public.sh文件在同一目录下,注意有空格】
	   echo "ip10 is:$ip10"
	   echo "dir_path is:$dir_path"
		
	//案例1	判断输入
		[root@localhost b]# vim 1.sh 

		  1 #!/bin/bash
		  2 read -p "please input number: " num
		  3 while true
		  4 do
		  5         if [[ "$num" =~ ^[0-9]+$ ]];then //注意空格
		  6                 echo $num
		  7                 break
		  8         else
		  9                 echo "error number!"
		 10                 read -p "不是数字 please input number: " num
		 11         fi
		 12 done
		 13 
		 14 read -p "please input prefix: " prefix
		 15 while true
		 16 do
		 17         if [ ! -z "$prefix" ];then //注意空格
		 18                 echo $prefix
		 19                 break
		 20         else
		 21         read -p "为空字符串,请重新输入: " prefix
		 22         fi
		 23 done
	//案例1.1 数组案例
		  1 #!/bin/bash
		  2 while read line 【read擅长处理文件,读取一行数据复制给变量line】
		  #for line in 'cat /etc/hosts' 【for会把换行符,空格符等都当成一行数据】
	 	   3 do
		  4         hosts[i++]=$line //i从0开始,i++从0开始,++i从1开始。
		  5 done < /etc/hosts
		  6 
		  7 echo -e "hosts文件的第一行数据为: \n\t${hosts[0]}"
		  8 for i in ${!hosts[@]};do
		  9         echo "第$i行数据为: ${hosts[i]}"
		 10 done

	//案例1.2 统计个数
		  1 #!/bin/bash
		  2 declare -A shells
		  3 while read line
		  4 do
		  5         type=`echo $line|awk -F: '{print $NF}'`
		  6         let shells[$type]++
		  7 done < /etc/passwd
		  8 
		  9 for i in ${!shells[@]};do
		 10         echo "$i:${shells[$i]}"
		 11 done
		 
	[root@localhost a]# awk -F: '{print $NF}' /etc/passwd|sort|uniq -c
	
	//案例2 备份
		  1 #!/bin/bash
		  2 back_dir=/root/e
		  3 if ! test -d $back_dir;then //test可以与[]相互替换
			// if [ ! -d $back_dir ];then
		  4         mkdir -p $back_dir
		  5         echo "已创建"
		  6 fi
		  7 echo "开始备份ing..."
		  
	//案例3 监控发邮件 通过管道发邮件
		  1 #!/bin/bash
		  2 mail_user=zrx
		  3 disk_user=`df -Th | grep '/$' | awk '{print $(NF-1)}'| \
		  4 awk -F"%" '{print $1}'`
		  5 if (( $disk_user <= 90 ));then
		  6         echo "`date +%F-%H` disk: ${disk_user}%" |mail -s "disk war..." $mail_user
		  7 fi
		  
	//案例4 监控发邮件,通过读文件发邮件
		  1 #!/bin/bash
		  2 mem_used=`free -m | grep '^Mem' | awk '{print $3}'`
		  3 mem_total=`free -m | grep '^Mem' | awk '{print $2}'`
		  4 mem_precent=$[ mem_used*100/mem_total ]
		  5 war_file=/root/b/1.txt
		  6 
		  7 if (($mem_precent>20));then
		  8         echo "`date +%F-%T` memory:${mem_precent}%" >> $war_file
		  9         echo '输出成功'
		 10 fi
		 11 
		 12 if [ -f $war_file ];then
		 13         mail -s "4.sh的邮件" zrx < $war_file
		 14 fi
     
	//案例5 ping通
		  1 #!/usr/bin/bash
		  2 ip=172.25.242.66
		  3 for ((i=1;i<=5;i++))//for 循环的两种写法
		    //i=5
			//for i in {1..$i}
			//for i in `seq $num`
		  4 do
		  5         ping -c1 $ip &> /dev/null
		  6         if [ $? -eq 0 ];then
		  7                 echo "$ip is up"
		  8         fi
          9 done   
		  
	//案例5.1 群ping通案例
		  1 #!/bin/bash
		  2 >ip.txt //重定向ip.txt,覆盖原先的内容
		  3 for i in {2..254}
		  // for ip in `cat ip.txt`
		  4 do
		  5         {
		  6         ip=192.168.197.$i
		  7         ping -c1 -W1 $ip &>/dev/null //设置超时
		  8         if [ $? -eq 0 ];then
		  9                 echo "`date +%F-%T`--$ip" | tee -a ip.txt //内容输出追加到文件
		 10         fi
		 11         }&//因为总耗时太长,且前台要等待程序执行完毕才能操作很不方便,所以调到后台运行
		 12 done
		 13 wait //等待后台进程运行结束
		 14 echo "finishing..."

	//案例6 创建用户
		  1 #!/bin/bash
		  2 read -p "Please input number: " num
		  3 read -p "Please input user_name_prefix: " prefix
		  4 
		  5 if [[ ! "$num" =~ ^[0-9]+$ || "$num" =~ ^0+$ ]];then
		  6         echo "error_number"
		  7         exit
		  8 fi
		  9 
		 10 if [ -z "$prefix" ];then
		 11         echo "error_prefix"
		 12         exit
		 13 fi
		 14 
		 15 for i in `seq $num`
		 16 do
		 17         user=$prefix$i
		 18         useradd $user
		 19         echo "123123" | passwd --stdin $user\
		 20         &>/dev/null
		 21         if [ $? -eq 0 ];then
		 22                 echo "$user is created"
		 23         fi
		 24 done
		 
	
  
		  
		  
		  

3、shell案例

//案例6.1 批量用户
		  1 #!/bin/bash
		  2 while :
		  3 do
		  4         read -p "Please enter prefix & passwd & num: " prefix passwod num
		  5         printf "user information:
		  6         -------------------------
		  7         user prefix: $prefix
		  8         user password: $passwod
		  9         user number: $num
		 10         -------------------------
		 11         "
		 12         read -p "Are you sure?[y/n]: " action
		 13         if [ "$action" = "y" ];then
		 14                 break
		 15         fi
		 16 done
		 17 
		 18 for i in `seq -w $num`
		 19 do
		 20         user=$prefix$i
		 21         id $user &>/dev/null
		 22         if [ $? -eq 0 ];then
		 23                 echo "user $user already exists"
		 24         else
		 25                 useradd $user
		 26                 echo "$passwod" | passwd --stdin $user &>/dev/null
		 27                 if [ $? -eq 0 ];then
		 28                         echo "$user is created..."
		 29                 fi
		 30         fi
		 31 done
	
	//案例7 删除用户
		  1 #!/bin/bash
		  2 read -p "Please input a username: " user
		  3 
		  4 id $user &>/dev/null
		  5 if [ $? -ne 0 ];then
		  6         echo "no user $user existed"
		  7         exit 1
		  8 fi
		  9 
		 10 read -p "Are you sure?[y/n]: " action
		 11 case "$action" in
		 12 n|N|NO|no)
		 13         echo "没有删除"
		 14         exit 2;;
		 15 *)
		 16         userdel -r $user
		 17         echo "$user has deleted!";;
		 18 esac
		 19 #if [ "$action" != "y" -o "$action" !="Y" ];then
		 20 #       echo "没有删除"
		 21 #       exit 2
		 22 #fi
		 23 #userdel -r $user
		 24 #echo "$user has deleted!"

	//案例8 系统工具箱
		  1 #!/usr/bin/bash
		  2 menu() {
		  3         cat <<-EOF //直接输出到屏幕
		  4         #################################
		  5         #       h -- help               #
		  6         #       f -- partition          #
		  7         #       d -- dilesystem mount   #
		  8         #       m -- memory             #
		  9         #       u -- system load        #
		 10         #       q -- exit               #
		 11         #################################
		 12         EOF
				/*
					cat >/root/b/demo_bak/demo_centos7u9.repo <<-EOF //内容输入到文件
		  7         [centos7u3]
		  8         name=centos7u9
		  9         baseurl=ftp://$yum_server/centos7u9
		 10         gbgcheck=0
		 11         EOF
				*/		 
		 13 }
		 14 menu //调用函数
		 15 
		 16 while :
		 17 do
		 18         read -p "Please input [h for help]: " action
		 19         case "$action" in
		 20         h)
		 21                 clear
		 22                 menu //调用函数
		 23                 ;;
		 24         f)
		 25                 fdisk -l
		 26                 ;;
		 27         d)
		 28                 df -Th
		 29                 ;;
		 30         m)
		 31                 free -m
		 32                 ;;
		 33         u)
		 34                 uptime
		 35                 ;;
		 36         q)
		 37                 #exit
		 38                 break
		 39                 ;;
		 40         "")
		 41                 ;;
		 42         *)
		 43                 echo "error_input"
		 44         esac
		 45 done
		 46 echo "finish... "
	
	//案例9 模拟配置yum源
		  1 #!/bin/bash
		  2 yum_server=xx.xx.xx.xx
		  3 os_version=`cat /etc/redhat-release | awk '{print $7}'`
		  4 [ -d /root/b/demo_bak ] || mkdir /root/b/demo_bak
		  5 if [ "$os_version" = "7.9" ];then
		  6         cat >/root/b/demo_bak/demo_centos7u9.repo <<-EOF
		  7         [centos7u3]
		  8         name=centos7u9
		  9         baseurl=ftp://$yum_server/centos7u9
		 10         gbgcheck=0
		 11         EOF
		 12         echo "$os_version yum configure..."
		 13 elif [ "$os_version" = "6.8" ];then
		 14         curl -o /root/b/demo_bak/demo_centos7u9.repo http://$yum_server/centos6u8.repo
		 15         echo "6.8 yum config..."
		 16 fi
	//案例9.1 创建lv快照
		  1 #!/bin/bash
		  2 info(){
		  3         echo -e "\e[1;31m\tVG空闲空间:\e[0m"
		  4         vgdisplay|awk '/VG\sName/||/PE/{printf "%s\n",$0}'
		  5         echo -e "\e[1;31m\tLV空间:\e[0m"
		  6         lvdisplay|awk '/LV\sPath/||/LV\sSize/{print $0}'
		  7 }
		  8 creatsnap(){
		  9         lvcreate -n $lvnap -L $size -s "$vgpath$lvname"
		 10         lvdisplay "$vgpath/$lvnap"
		 11 }
		 12 while(true);do
		 13         read -p "Please input your choose:Info[1],CreatSnap[2]" choose
		 14         case "$choose" in
		 15         1)
		 16                 info
		 17                 ;;
		 18         2)
		 19                 read -p "Please input 快照大小 /VG全路径 /LV源名: " size vgpath lvname
		 20                 lvnap="`date +%F%T|awk -F- '{print $2$3}'|awk -F: '{printf "%d-%d\n",$1,$2}'`_snap"
		 21                 creatsnap
		 22                 ;;
		 23         *)
		 24                 exit
		 25         esac
		 26 done

	
	 //案例10 收集系统信息
		/*【少在if中用正则表达式】
		  在单引号中引用外部变量。	${} 变量取值
				for i in $a;then
				...|awk '{$1=='''$i'''print $5}';echo "${i}"
				done	  
		*/  
		  1 #!/bin/bash
		  2 #show system information
		  3 PS3="Please input your choice[10 for quit]: "
		  4 ##根据系统类型判断使用哪种包管理器下载
		  5 os_check(){
		  6         if [ -e /etc/redhat-release ];then
		  7                 REDHAT=`awk -F ' ' '{print $1}' /etc/redhat-release`
		  8         else
		  9                 DEBIAN=`awk -F ' ' '{print $1}' /etc/issue`
		 10         fi
		 11 
		 12         if [ "$REDHAT"=="CentOS" -o "$REDHAT"=="Red" ];then
		 13                 P_M=yum
		 14         elif [[ "$DEBIAN" =~ [Uu]buntu ]];then
		 15                 P_M=apt-get
		 16         else
		 17                 echo "Operating system does not support
		 18                 exit 1" 
		 19         fi
		 20 }
		 21 
		 22 if [ "$LOGNAME" != "root" ];then
		 23         echo "Please use the root acount operation"
		 24         exit 1
		 25 fi
		 26 
		 27 if ! which vmstat &>/dev/null;then
		 28         echo "vmstat command not found,now the stall"
		 29         sleep 1
		 30         os_check
		 31         $P_M install procps -y
		 32         echo "============================================="
		 33 fi
		 34 
		 35 if ! which iostat &>/dev/null;then
		 36         echo "iostat command not found,now the install"
		 37         sleep 1
		 38         os_check
		 39         $P_M install sysstat -y
		 40         echo "==========================================="
		 41 fi
		 42 
		 43 while true;do
		 44         select input in cpu_load disk_load disk_use disk_inde mem_use tcp_status cpu_top10 mem_top1p traffic quit
		 45         do
		 46         case $input in
		 47         cpu_load)
		 48                 #CPU利用率与负载
		 49                 echo -e "\e[1;31m CPU利用率与负载vmstat\e[0m"
		 50                 i=1
		 51                 while [ $i -le 3 ];do
		 52                         echo -e "\e[1;31m 参考值${i}\e[0m"              
		 53                         UTIL=`vmstat |awk 'NR==3{print 100-$15"%"}'`
		 54                         USER=`vmstat |awk 'NR==3{print $13"%"}'`
		 55                         SYS=`vmstat |awk '{if(NR==3){print $14"%"}}'`
		 56                         IOWAIT=`vmstat |awk '{if(NR==3){print $16"%"}}'`
		 57                         echo "UTIL:$UTIL"
		 58                         echo "USER use:$USER"                   
		 59                         echo "System use:$SYS"
		 60                         echo "I/O wait:$IOWAIT"
		 61                         let i++
		 62                         sleep 1
		 63                 done
		 64                 break
		 65         ;;
		 66 
		 67         disk_load)
		 68                 #IO磁盘负载
		 69                 echo -e "\e[1;31m IO磁盘负载iostat\e[0m"
		 70                 i=1
		 71                 while [ $i -le 3 ];do
		 72                         echo -e "\e[1;31m 参考值${i} \e[0m"
		 73                         UTIL=`iostat -x -k|awk '/^[v|s]/{print $1,$NF"%"}'`
		 74                         READ=`iostat -x -k|awk '/^[vs].*/{print $1,$6"KB"}'`
		 75                         WRITE=`iostat -x -k|awk '/^[vs].*/{print $1,$7"KB"}'`
		 76                         IOWAIT=`iostat -x -k|awk 'NR==4{print $4}'`
		 77                         echo -e "UTIL:\n$UTIL"
		 78                         echo -e "READ:\n$READ"
		 79                         echo -e "WRITE:\n$WRITE"                        
		 80                         echo -e "IOWAIT:\n$IOWAIT"
		 81                         i=$(($i+1))
		 82                         sleep 1
		 83                 done
		 84                 break
		 85         ;;
		 86 
		 87         disk_use)
		 88                 echo -e "\e[1;31m 硬盘利用率\e[0m"
		 89                 DISK_LOG=/tmp/disk_use.txt
		 90                 #DISK_TOTAL=`fdisk -l|awk '/^Disk.*\/dev/{print $2,$3,$4}'`             
		 91                 DISK_TOTAL=`fdisk -l|awk '/^Disk.*/&&/\/dev/{print $2,$3,$4}'`
		 92                 USE_RATE=`df -h|awk '/^\/dev/{print int($5)}'`
		93                 for i in $USE_RATE;do
		 94                         if [ $i -gt 90 ];then
		 95                                 #输出超过90%的磁盘挂载地址
		 96                                 PART=`df -h|awk '{if(int($5)=="'$i'") print $6}'`
		 97                                 echo "$PART : ${i}%" >> $DISK_LOG
		 98                         fi
		 99                 done
		100                 if [ -f $DISK_LOG ];then
		101                         echo `date +%F-%T`|mail -s "容量报警" -a $DISK_LOG 2252991813@qq.com
		102                         cat $DISK_LOG
		103                         rm -f $DISK_LOG
		104                 else
		105                         echo "Disk user rate no than 90% of the partition"
		106                 fi
		107                 break
		108         ;;
		109 
		110         disk_inde)
		111                 echo -e "\e[1;31m 硬盘inode利用率\e[0m"
		112                 INODE_LOG=/tmp/inode_log.txt
		113                 INODE_USE=`df -i|awk '/^\/dev/{print int($5)}'`
		114                 for i in $INODE_USE;do
		115                         if [ $i -gt 90 ];then
		116                                 PART=`df -i|awk '{if(int($5)=="'$i'")print $6}'`
		117                                 echo "$PART=${i}%" >> $INODE_LOG
		118                         fi
		119                 done
		120                 if [ -f $INODE_LOG ];then
		121                         echo `date +%F-%T`|mail -s "inode报警" -a $INODE_LOG 2252991813@qq.com
		122                         cat $INODE_LOG
		123                         rm -f $INODE_LOG
		124                 else
		125                         echo "Inode use rate no than 90% of the partition"
		126                 fi
		127                 break
		128         ;;
		129 
		130         mem_use)
		131                 echo -e "\e[1;31m 内存使用情况\e[0m"
		132                 free -h
		133                 break
		134         ;;
		135 
		136         tcp_status)
		137                 break
		138         ;;
		139 
		140         cpu_top10)
		141                 break
		142         ;;
		143 
		144         mem_toplp)
		145                 break
		146         ;;
		147 
		148         traffic)
		149                 break
		150         ;;
		151 
		152         quit)
		153                 exit 1
		154         ;;
		155         esac
		156         done
		157 done

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值