目录
1、网络层次
n、抓包、wireshark
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、电气特性定义。【规定传输线中哪几根是干什么的】
1.2、TCP/IP
校验和:做数据校验的
标准子网掩码【标准子网,默认不写】:
C类:/24
B类:/16
A类:/8
有效子网:在0和1 都有的那一段8位数,就是有效子网
1.3 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