CentOS shell企业案例实战
Posted 白菜素三鲜丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CentOS shell企业案例实战相关的知识,希望对你有一定的参考价值。
shell企业案例实战
企业中常用的监控命令
监控目录 | 命令 |
---|---|
本地端口监控 | netstat -lntup<br>ss -lntup<br>lsof |
远端端口监控 | telnet<br>nc<br>nmap |
进程监控 | ps -ef<br>ps aux |
web监控 | curl<br>wget |
数据库 | mysql-uroot-p123 -e select ping() |
内存 | free -n |
磁盘 | df -h |
文件内容 | md5 |
端口检查
本地端口监测
## 错误方式
[root@web01 ~]# netstat -lntup| grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 874/sshd
tcp6 0 0 :::22 :::* LISTEN 874/sshd
## 正确方式
[root@web01 ~]# netstat -lntup| grep [s]sh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 874/sshd
tcp6 0 0 :::22 :::* LISTEN 874/sshd
[root@web01 ~]# netstat -lntup | grep -w 22 &>/dev/null
[root@web01 ~]# echo $?
0
[root@web01 ~]# netstat -lntup | grep -w 555 &>/dev/null
[root@web01 ~]# echo $?
1
[root@web01 ~]# netstat -lntup | grep -w 555 | wc -l
0
[root@web01 ~]# netstat -lntup | grep -w 22 | wc -l
2
## ss
[root@web01 ~]# ss -lntup | grep 22
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=874,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=874,fd=4))
[root@web01 ~]# ss -lntup | grep -w 22
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=874,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=874,fd=4))
使用脚本判断远程端口是否存货
## telnet
[root@web01 ~]# vim c.sh
#!/bin/bash
ip=$1
port_count=`echo | telnet 172.16.1.8 22 2>/dev/null | grep Connected | wc -l`
if [ $port_count -eq 0 ]
then
echo 窗口不存活
else
echo 窗口存活
fi
[root@web01 ~]# sh c.sh
窗口存活
## 使用telnet端口扫描
[root@web01 ~]# vim c.sh
#!/bin/bash
. /etc/init.d/functions
ip=$1
for port in `seq 100`;do
port_count=`echo | telnet $ip $port 2>/dev/null| grep Connected | wc -l`
if [ $port_count -ne 0 ];then
action "$port 端口" /bin/true
fi
&
done
[root@web01 ~]# sh c.sh 172.16.1.8
[root@web01 ~]# 22 端口 [ OK ]
## nc 网络中的瑞士军刀
[root@web01 ~]# echo | nc 172.16.1.8 80
[root@web01 ~]# echo $?
0
[root@web01 ~]# echo | nc 172.16.1.8 225
Ncat: Connection refused.
[root@web01 ~]# echo $?
1
# nc选项
-l:开启一个指定的端口
-k:保持端口持续连接
-u:指定nc使用UDP协议(默认tcp)
-s:指定发送数据的源IP地址,适用于多网卡机器
-w:设置超时时间
-z:扫描时不发送任何数据
## nmap
# 扫描单个IP
[root@web01 ~]# nmap 172.16.1.8
Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-22 20:01 CST
Nmap scan report for 172.16.1.8
Host is up (0.00048s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
MAC Address: 00:0C:29:08:E6:A5 (VMware)
# 扫描单个IP的单个端口
[root@web01 ~]# nmap -p 80 172.16.1.8
Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-22 20:02 CST
Nmap scan report for 172.16.1.8
Host is up (0.0020s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:0C:29:08:E6:A5 (VMware)
# 扫描单个IP范围的端口
[root@web01 ~]# nmap -p 1-80 172.16.1.8
Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-22 20:03 CST
Nmap scan report for 172.16.1.8
Host is up (0.00037s latency).
Not shown: 78 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 00:0C:29:08:E6:A5 (VMware)
# 扫描多个IP范围的端口
[root@web01 ~]# nmap -p 1-80 172.16.1.8 172.16.1.61
Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-22 20:04 CST
Nmap scan report for 172.16.1.8
Host is up (0.00091s latency).
Not shown: 78 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 00:0C:29:08:E6:A5 (VMware)
Nmap scan report for 172.16.1.61
Host is up (0.0011s latency).
Not shown: 78 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 00:0C:29:16:2E:16 (VMware)
进程判断
[root@web02 ~]# ps -ef | grep [n]ginx
root 5950 1 0 19:43 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 5951 5950 0 19:43 ? 00:00:00 nginx: worker process
nginx 5952 5950 0 19:43 ? 00:00:00 nginx: worker process
[root@web02 ~]# ps -ef | grep [n]ginx | wc -l
3
[root@web02 ~]# systemctl stop nginx
[root@web02 ~]# ps -ef | grep [n]ginx | wc -l
0
## 远程进程检测
[root@web01 ~]# vim jc.sh
proc_count=`ssh 172.16.1.8 ps -ef|grep [n]ginx|wc -l`
if [ $proc_count -eq 0 ];then
echo nginx不存活
else
echo nginx存活
fi
[root@web01 ~]# sh jc.sh
nginx不存活
网站检测
## curl选项
-I:获取主机响应头部信息
-s:默认输出
-o:保存下载页面内容
-w:获取状态码
-u:身份认证 -u 用户名:密码
-H:添加请求头部信息
-v:显示详细信息
-L:跟随跳转
-x:指定请求的方式
-A:修改用户的客户端
[root@web02 ~]# curl -s -w "%http_code" -o /dev/null blog.wsh.com
200
[root@m01 ~]# curl -uzls:zls -s -w "%http_code" -o /dev/null blog.zls.com
[root@web02 ~]# curl -v http://blog.wsh.com -L
## wget选项
-O:保存下载页面内容
-r:递归下载
--debug:显示访问的详细过程,类似 curl -v
-q:静默输出,类似 curl -s
--spider:只看不下载
文件检测
[root@web01 ~]# vim 2.txt
[root@web01 ~]# md5sum 2.txt
1e2284211f7b4b5231d396759302c364 2.txt
[root@web01 ~]# md5sum 2.txt > /tmp/check_2.txt
[root@web01 ~]# md5sum -c /tmp/check_2.txt
2.txt: OK
[root@web01 ~]# echo 555 > 2.txt
[root@web01 ~]# md5sum -c /tmp/check_2.txt
2.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
练习题
监控系统内存,如果不足30%就发送邮件告警通知运维人员
[root@web01 ~]# yum -y install mailx
[root@web01 ~]# vim /etc/mail.rc
set from=540080971@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=540080971@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
[root@web01 ~]# vim free.sh
#!/bin/bash
cache=`free -m | awk NR==2print int($3/($3+$4)*100)`
if [ $cache -gt 70 ]
then
echo "内存不足30%" | mail 540080971@qq.com
fi
检测nginx服务是否正常,业务是否正常
[root@web02 blog]# vim /etc/nginx/conf.d/wsh.conf
server
listen 80;
server_name blog.wsh.com;
root /blog;
index index.html;
[root@web02 blog]# vim index.html
www
fff
555
777
[root@web02 blog]# systemctl start nginx
[root@web02 blog]# netstat -lntup | grep [n]ginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5118/nginx: master
[root@web02 ~]# vim web.sh
#!/bin/bash
web1=`netstat -lntup | grep [n]ginx | wc -l`
web2=`ps -ef | grep [n]ginx | wc -l`
web3=`curl -s -w "%http_code" -o /dev/null blog.wsh.com`
if [ $web1 -eq 0 ];then
echo 端口不存在
elif [ $web2 -eq 0 ];then
echo "进程不存在"
elif [[ $web3 =~ ^[^2-3] ]];then
echo "服务已挂,状态码为:$web3"
else
echo "业务正常"
fi
[root@web02 ~]# sh web.sh blog.wsh.com
业务正常
[root@web02 ~]# rm -f /blog/index.html
[root@web02 ~]# sh web.sh blog.wsh.com
服务已挂,状态码为:403
方拾二
1.监控系统内存,如果不足30%就发送邮件告警通知运维人员
[root@m01 ~]# yum install -y mailx
set from=253097001@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=253097001@qq.com
set smtp-auth-password=#客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
## 系统内存
# 可用内存
[root@m01 ~]# free -m|awk NR==2print $NF
692
# 所有内存
[root@m01 ~]# free -m|awk NR==2print $2
972
[root@m01 ~]# vim check_mem.sh
#!/bin/bash
IP=`ifconfig eth0|awk NR==2print $2`
mem_ava=`free -m|awk NR==2print int($NF/$2*100)`
mem_info=`free -m|awk NR==2print $NF`
if [ $mem_ava -lt 30 ];then
echo -e "IP地址:$IP\\n主机名:$HOSTNAME\\n内存可用率:低于30%\\n当前可用内存:$mem_infoM" \\
|mail -s "$IP内存检测结果" 133411023@qq.com
fi
<table border=1px color=red>
<tbody>
<tr bgcolor="lightgreen">
<td colspan=7 align=center>内存监控信息</td>
</tr>
<tr>
<td align=center>IP地址</td>
<td align=center>主机名</td>
<td align=center>内存可用率</td>
<td align=center>当前可用内存</td>
</tr>
<tr>
<td align=center>passwd</td>
<td align=center>/etc/</td>
<td align=center>31</td>
<td align=center>删除用户</td>
</tr>
</tbody>
</table>
使用sendEmail
# 1.下载sendEmail
wget http://test.driverzeng.com/other/sendEmail-v1.56.tar.gz
# 2.安装依赖
yum install perl-Net-SSLeay perl-IO-Socket-SSL -y
# 3.解压
tar xf sendEmail-v1.56.tar.gz
# 4.创建安装目录
[root@m01 ~]# mkdir /app
# 5.移动软件到安装目录中
[root@m01 ~]# mv sendEmail-v1.56 /app/
# 6.添加环境变量
[root@m01 ~]# vim /etc/profile.d/sendEmail.sh
PATH="/app/sendEmail-v1.56:$PATH"
# 7.加载环境变量
[root@m01 ~]# source /etc/profile
## sendEmail选项
-f 112233@qq.com# 发件人邮箱地址
-t 445566@qq.com# 收件人邮箱地址
-s smtp.qq.com# 发件人邮箱的smtp服务器地址
-u zls test email# 邮件标题
-m test mail content# 邮件内容
-a /tmp/data.txt /tmp/1.jpg#发送附件
-xu 112233# 发件人邮箱登录用户名
-xp fdnzuslqhshgkslxj# 发件人邮箱登录密码(QQ邮箱的授权码)
-cc 222222@qq.com# 抄送指定用户
-bcc 333333@qq.com# 加密抄送
-o message-content-type=html# 邮件内容格式为html
-o message-file=FILE# 指定某个文件内容作为邮件内容
-o message-charset=utf8# 邮件内容编码为utf8
-o tls=no#关闭tls握手
## 发送html格式邮件
[root@m01 ~]# cat check_mem.sh
#!/bin/bash
IP=`ifconfig eth0|awk NR==2print $2`
mem_ava=`free -m|awk NR==2print int($NF/$2*100)`
mem_info=`free -m|awk NR==2print $NF`
if [ $mem_ava -gt 30 ];then
cat > mem_info.txt <<EOF
<table border=1px color=red>
<tbody>
<tr bgcolor="#fff000">
<td colspan=7 align=center>内存监控信息</td>
</tr>
<tr>
<td align=center>IP地址</td>
<td align=center>主机名</td>
<td align=center>内存可用率</td>
<td align=center>当前可用内存</td>
</tr>
<tr>
<td align=center>$IP</td>
<td align=center>$HOSTNAME</td>
<td align=center>小于30%</td>
<td align=center>$mem_infoM</td>
</tr>
</tbody>
</table>
EOF
sendEmail -f 253097001@qq.com \\
-t 133411023@qq.com \\
-s smtp.qq.com \\
-u "$IP主机内存检测结果" \\
-xu 253097001 \\
-xp tcrvcdgkxxgybiab \\
-o message-content-type=html \\
-o message-file=mem_info.txt \\
-o message-charset=utf8 \\
-o tls=no
fi
2.检查nginx服务是否正常,业务是否正常
[root@m01 ~]# cat check_web.sh
#!/bin/bash
. /etc/init.d/functions
domain_name_list=(www.zls.com blog.zls.com php.zls.com)
IP_list=(10.0.0.61 10.0.0.7)
proc_count=`ps -ef|grep [n]ginx|wc -l`
port_80_count=`netstat -lntup|grep -w 80|wc -l`
port_443_count=`netstat -lntup|grep -w 443|wc -l`
# 本地
for domain_name in $domain_name_list[*];do
http_code=`curl -s -w "%http_code" -o /dev/null $domain_name`
if [ $http_code -eq 401 ];then
action "$domain_name网站正常,但是身份验证不通过" /bin/false
elif [[ $http_code =~ ^[4-5] ]];then
action "$domain_name网站无法访问" /bin/false
elif [ $proc_count -le 0 ];then
action "nginx进程" /bin/false
elif [ $port_80_count -le 0 ];then
action "nginx的80端口检测" /bin/false
#elif [ $port_443_count -le 0 ];then
# echo nginx的443端口不存在
else
action "$domain_name网站" /bin/true
fi
done
# 远程
for IP in $IP_list[*];do
proc_count=`ssh $IP "ps -ef|grep [n]ginx|wc -l"`
port_80_count=`ssh $IP "netstat -lntup|grep -w 80|wc -l"`
port_443_count=`ssh $IP "netstat -lntup|grep -w 443|wc -l"`
for domain_name in $domain_name_list[*];do
http_code=`curl -s -w "%http_code" -o /dev/null $domain_name`
if [ $http_code -eq 401 ];then
action "$domain_name网站正常,但是身份验证不通过" /bin/false
elif [[ $http_code =~ ^[4-5] ]];then
action "$domain_name网站无法访问" /bin/false
elif [ $proc_count -le 0 ];then
action "$IP nginx进程" /bin/false
elif [ $port_80_count -le 0 ];then
action "$IP nginx的80端口检测" /bin/false
#elif [ $port_443_count -le 0 ];then
# echo nginx的443端口不存在
else
action "$domain_name网站" /bin/true
fi
done
done
以上是关于CentOS shell企业案例实战的主要内容,如果未能解决你的问题,请参考以下文章