第 1 章 Shell 编程高级企业实战
企业生产环境中,服务器规模成百上千,如果依靠人工去维护和管理是非常吃力的,基
于 Shell 编程脚本管理和维护服务器变得简单、从容,而且对企业自动化运维之路的建设起
到极大的推动作用。
本章向读者介绍企业生产环境 Shell 编程案例、自动化备份 MySQL 数据、服务器信息
收集、防止恶意 IP 访问、LAMP+MySQL 主从实战、千台服务器 IP 修改、Nginx+Tomcat
高级自动化部署脚本、Nginx 虚拟主机配置、Docker 管理平台等。
1.1 Shell 编程实战系统备份脚本
日常企业运维中,需要备份 Linux 操作系统中重要的文件,例如/etc、/boot 分区、重要
网站数据等,在备份数据时,由于数据量非常大,需要指定高效的备份方案,如下为常用的
备份数据方案:
每周日进行完整备份,周一至周六使用增量备份;
每周六进行完整备份,周日至周五使用增量备份。
企业备份数据的工具主要有:tar、cp、rsync、scp、sersync、dd 等工具。如下为基于开
源 tar 工具实现系统数据备份方案:
Tar 工具手动全备份网站,-g 参数指定新的快照文件:
tar -g
/tmp/snapshot
-czvf
/tmp/2017_full_system_data.tar.gz
/data/sh/
Tar 工具手动增量备份网站,-g 参数指定全备已生成的快照文件,后续增量备份基于上
一个增量备份快照文件:
tar -g
/tmp/snapshot
-czvf
/tmp/2014_add01_system_data.tar.gz /data/sh/
Tar 工具全备、增量备份网站,Shell 脚本实现自动打包备份编写思路如下:
系统备份数据按每天存放;
创建完整备份函数块;
创建增量备份函数块;
根据星期数判断完整或增量;
将脚本加入 Crontab 实现自动备份;
Tar 工具全备、增量备份网站,Shell 脚本实现自动打包备份,代码如下:
#!/bin/bash
#Auto Backup Linux System Files
#By author jfedu.net 2017
#Define Path variables
SOURCE_DIR=(
$*
)
TARGET_DIR=/data/backup/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
A_NAME=`date +%H%M`
FILES=system_backup.tgz
CODE=$?
if
[ -z "$*" ];then
echo
-e
"\033[32mUsage:\nPlease
Enter
Your
Backup
Files
or
Directories\n--------------------------------------------\n\nUsage: { $0 /boot /etc}\033[0m"
exit
fi
#Determine Whether the Target Directory Exists
if
fi
[ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
echo -e "\033[32mThe $TARGET_DIR Created Successfully !\033[0m"
#EXEC Full_Backup Function Command
Full_Backup()
{
if
[ "$WEEK" -eq "7" ];then
rm -rf $TARGET_DIR/snapshot
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ; tar -g $TARGET_DIR/snapshot -czvf
$FILES ${SOURCE_DIR[@]}
[ "$CODE" == "0" ]&&echo -e
"--------------------------------------------\n\033[32mThese
Full_Backup System Files Backup Successfully !\033[0m"
fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
if
[ $WEEK -ne "7" ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf
$A_NAME$FILES ${SOURCE_DIR[@]}
[ "$CODE" == "0" ]&&echo -e
"-----------------------------------------\n\033[32mThese
Add_Backup
System
$TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES
Files
Backup
Successfully !\033[0m"
fi
}
sleep 3
Full_Backup;Add_Backup
Crontab 任务计划中添加如下语句,每天凌晨 1 点整执行备份脚本即可:
0
1
*
*
* /bin/sh /data/sh/auto_backup.sh /boot /etc/ >> /tmp/back.log 2>&1
1.2 Shell 编程实战收集服务器信息
在企业上产环境中,经常会对服务器资产进行统计存档,单台服务器可以手动去统计服
务器的 CPU 型号、内存大小、硬盘容量、网卡流量等,如果服务器数量超过百台、千台,
使用手工方式就变得非常吃力。
基于 Shell 脚本实现自动化服务器硬件信息的收集,并将收集的内容存放在数据库,能
更快、更高效的实现对服务器资产信息的管理。Shell 脚本实现服务器信息自动收集,编写
思路如下:
创建数据库和表存储服务器信息;
基于 Shell 四剑客 awk、find、sed、grep 获取服务器信息;
将获取的信息写成 SQL 语句;
定期对 SQL 数据进行备份;
将脚本加入 Crontab 实现自动备份;
创建数据库表,创建 SQL 语句如下:
CREATE TABLE `audit_system` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip_info` varchar(50) NOT NULL,
`serv_info` varchar(50) NOT NULL,
`cpu_info` varchar(50) NOT NULL,
`disk_info` varchar(50) NOT NULL,
`mem_info` varchar(50) NOT NULL,
`load_info` varchar(50) NOT NULL,
`mark_info` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ip_info` (`ip_info`),
UNIQUE KEY `ip_info_2` (`ip_info`)
);
Shell 脚本实现服务器信息自动收集,代码如下:
#!/bin/bash
#Auto get system info
#By author jfedu.net 2017
#Define Path variables
echo -e "\033[34m \033[1m"
cat <
echo -e
'\033[31mmysql -uaudit -p123456 -D audit -e ''' "insert
into audit_system
values('','${ip_info}','$serv_info','${cpu_info1}
X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')" ''' \033[0m '
mysql
-uroot
-p123456
-D
test
-e
"insert
into
audit_system
values('','${ip_info}','$serv_info','${cpu_info1}
X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')"
else
fi
echo "Please wait,exit......"
exit
手动读取数据库服务器信息命令:
mysql -uroot -p123 -e 'use wugk1 ;select * from audit_audit_system;'|sed 's/-//g'|grep -v "id"
1.3 Shell 编程实战拒绝恶意 IP 登录
企业服务器暴露在外网,每天会有大量的人使用各种用户名和密码尝试登陆服务器,如
果让其一直尝试,难免会猜出密码,通过开发 Shell 脚本,可以自动将尝试登陆服务器错误
密码次数的 IP 列表加入到防火墙配置中。
Shell 脚本实现服务器拒绝恶意 IP 登陆,编写思路如下:
登陆服务器日志/var/log/secure;
检查日志中认证失败的行并打印其 IP 地址;
将 IP 地址写入至防火墙;
禁止该 IP 访问服务器 SSH 22 端口;
将脚本加入 Crontab 实现自动禁止恶意 IP;
Shell 脚本实现服务器拒绝恶意 IP 登陆,代码如下:
#!/bin/bash
#Auto drop ssh failed IP address
#By author jfedu.net 2017
#Define Path variables
SEC_FILE=/var/log/secure
IP_ADDR=`awk
'{print
$0}'
/var/log/secure|grep
-i
"fail"|
egrep
-o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort -nr | uniq -c |awk '$1>=15 {print $2}'`
IPTABLE_CONF=/etc/sysconfig/iptables
echo
cat </dev/null
if
[ $? -ne 0 ];then
sed -i "/lo/a -A INPUT -s $i
-m state --state NEW -m tcp -p tcp --dport 22 -j
DROP" $IPTABLE_CONF
fi
done
NUM=`find /etc/sysconfig/
-name iptables -a -mmin -1|wc -l`
if [ $NUM -eq 1 ];then
/etc/init.d/iptables restart
fi
1.4 Shell 编程实战 LAMP 一键安装
LAMP 是目前互联网主流 WEB 网站架构,通过源码安装、维护和管理对于单台很轻松,
如果服务器数量多,手工管理就非常困难,基于 Shell 脚本可以更快速的维护 LAMP 架构。
Shell 脚本实现服务器 LAMP 一键源码安装配置,编写思路如下:
脚本的功能,实现安装 LAMP 环境、论坛网站;
Apache 安装配置、MYSQL、PHP 安装;
源码 LAMP 整合配置;
启动数据库,创建数据库并授权;
重启 LAMP 所有服务, 验证访问;
Shell 脚本实现服务器 LAMP 一键源码安装配置,代码如下:
#!/bin/bash
#Auto install LAMP
#By author jfedu.net 2017
#Define Path variables
#Httpd define path variable
H_FILES=httpd-2.2.32.tar.bz2
H_FILES_DIR=httpd-2.2.32
H_URL=http://mirrors.cnnic.cn/apache/httpd/
H_PREFIX=/usr/local/apache2/
#MySQL define path variable
M_FILES=mysql-5.5.20.tar.gz
M_FILES_DIR=mysql-5.5.20
M_URL=http://down1.chinaunix.net/distfiles/
M_PREFIX=/usr/local/mysql/
#PHP define path variable
P_FILES=php-5.3.28.tar.bz2
P_FILES_DIR=php-5.3.28
P_URL=http://mirrors.sohu.com/php/
P_PREFIX=/usr/local/php5/
function httpd_install(){
if [[ "$1" -eq "1" ]];then