文章目录
一、shell常见系统变量
SHELL常见的系统变量解析 :
$0 当前程序的名称
$n 当前程序的第 n 个参数 ,n=1,2, , 9
$* 当前程序的所有参数 ( 不包括程序本身 )
$# 当前程序的参数个数 ( 不包括程序本身 )
$? 命令或程序执行完后的状态,一般返回 0 表示执行成功。
$UID 当前用户的 ID
$PWD 当前所在的目录
#!/bin/bash
#auto print variables
#by wugk 2014-09
echo -e '\033[32m-----------------------------\033[0m'
echo "This is $0 param !"
echo "This \$1 is $1 param !"
echo "This \$2 is $2 param !"
echo -e '\033[32m-----------------------------\033[0m'
echo "This \$* is $* param !"
echo "This \$# is $# param !"
echo "This \$? is $? param !"
二、if条件语句
2.1逻辑运算符解析
-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立( and) 逻辑表达式 –a 逻辑表达式
-o 单方成立( or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
2.2测试数字大小
注意,有两个(())括号
#!/bin/sh
NUM=100
if (( $NUM > 4 )) ;then
echo “this num is $NUM greater 4 ! ”
fi
2.3if多条件测试判断
#!/bin/sh
scores=80
if [[ $scores -gt 85 ]]; then
echo "very good!";
elif [[ $scores -gt 75 ]]; then
echo "good!";
elif [[ $scores -gt 60 ]]; then
echo "pass!";
else
echo "no pass!"
fi
2.4判断目录、文件是否存在
#!/bin/bash
#判断目录是否存在
if [ ! -d /tmp/2020 ];then
mkdir -p /tmp/2020
echo -e "\033[32mthis not exist. \033[0m"
else
echo -e "\033[32mthis exist. \033[0m"
fi
#判断文件是否存在
files=/tmp/test.txt
if [ ! -f $files ];then
echo "ok" >> $files
else
cat $files
fi
2.5备份mysql数据库
#!/bin/sh
#auto backup mysql
#wugk 2012-12-12
#Define PATH 定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#must use root user run scripts 必须使用 root 用户运行, $UID
为系统变量
if
[ $UID -ne 0 ];then
echo This script must use the root user ! ! !
sleep 2
exit 0
fi
#Define DIR and mkdir DIR 判断目录是否存在,不存在则新建
if
[ ! -d $BAKDIR ];then
mkdir -p $BAKDIR
else
echo This is $BAKDIR exists....
fi
#Use mysqldump backup mysql 使用 mysqldump备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d$MYSQLDB >$BAKDIR/webapp_db.sql
echo "The mysql backup successfully "
2.6配置定时任务
crontab -e
分、时、日、月、星期
配置每天0时0分执行数据库备份脚本:
三、一键源码安装 LAMP脚本
#!/bin/bash
#auto install LAMP
#by wugk 2014-11
#Httpd define path variable
H_FILES=httpd-2.2.27.tar.bz2
H_FILES_DIR=httpd-2.2.27
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/
echo -e '\033[32m-----------------------------\033[0m'
echo
if [ -z "$1" ];then
echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
echo -e "\033[32m1) 编译安装 Apache服务器\033[1m"
echo "2) 编译安装 MySQL服务器 "
echo "3) 编译安装 PHP服务器"
echo "4) 配置 index.php 并启动 LAMP服务"
echo -e "\033[31mUsage: { /bin/sh $0 1|2|3|4|help}\033[0m"
exit
fi
if [[ "$1" -eq "help" ]];then
echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
echo -e "\033[32m1) 编译安装 Apache服务器 \033[1m"
echo "2) 编译安装 MySQL服务器 "
echo "3) 编译安装 PHP服务器"
echo "4) 配置 index.php 并启动 LAMP服务"
echo -e "\033[31mUsage: { /bin/sh $0
1|2|3|4|help}\033[0m"
exit
fi
######################################
#Install httpd web server
if [[ "$1" -eq "1" ]];then
wget -c $H_URL/$H_FILES && tar -jxvf $H_FILES && cd $H_FILES_DIR &&./configure --prefix=$H_PREFIX
if [ $? -eq 0 ];then
make && make install
echo -e "\033[32mThe $H_FILES_DIR Server Install Success !\033[0m"
else
echo -e "\033[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......"
exit 0
fi
fi
#Install Mysql DB server
if [[ "$1" -eq "2" ]];then
wget -c $M_URL/$M_FILES && tar -xzvf $M_FILES && cd $M_FILES_DIR &&yum install cmake -y ;cmake . -DCMAKE_INSTALL_PREFIX=$M_PREFIX \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_BIG_TABLES=1 \
-DWITH_DEBUG=0
make && make install
/bin/cp support-files/my-small.cnf /etc/my.conf
/bin/cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
if [ $? -eq 0 ];then
make && make install
echo -e "\033[32mThe $M_FILES_DIR Server Install Success !\033[0m"
else
echo -e "\033[32mThe $M_FILES_DIR Make or Make install ERROR,Please Check......"
exit 0
fi
fi
#Install PHP server
if [[ "$1" -eq "3" ]];then
wget -c $P_URL/$P_FILES && tar -jxvf $P_FILES && cd $P_FILES_DIR &&./configure --prefix=$P_PREFIX --with-config-file-path=$P_PREFIX/etc --with-mysql=$M_PREFIX --with-apxs2=$H_PREFIX/bin/apxs
if [ $? -eq 0 ];then
make ZEND_EXTRA_LIBS='-liconv' && make install
echo -e "\033[32mThe $P_FILES_DIR Server Install Success !\033[0m"
else
echo -e "\033[32mThe $P_FILES_DIR Make or Make install ERROR,Please Check......"
exit 0
fi
fi
####################################
if [[ "$1" -eq "4" ]];then
sed -i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf $H_PREFIX/bin/apachectl restart
echo "AddType application/x-httpd-php .php" >>$H_PREFIX/conf/httpd.conf
IP=`ifconfig eth1|grep "Bcast"|awk '{print $2}'|cut -d: -f2`
echo "You can access http://$IP/"
cat >$H_PREFIX/htdocs/index.php <<EOF
<?php
phpinfo();
?>
EOF
fi
四、for循环
4.1 打印 seq 数字循环
#!/bin/sh
for i in `seq 15` do
echo “NUM is $i ”
done
4.2求和 1-100 的 值
#!/bin/bash #auto sum 1 100 j=0
for ((i=1;i<=100;i++))
do
j=`expr $i + $j`
done echo $j
4.3批量压缩
找到相关 log ,然后批量打包
打包最后的两个文件
#!/bin/sh
for i in `find /var/log -name "*.log" | tail -2`
do
tar -czf 2014log.tgz $i
done
批量解压:
#!/bin/sh
for i in `find /var/log -name "*.gz"`
do
tar -zxvf 2014log.tgz $i
done
4.4 批量传输文件
#!/bin/bash
#auto scp files for client #by authors wugk 2014
for i in `seq 100 200`
do
scp -r /tmp/test.txt root@192.168.1.$i:/data/webapps/www
done
4.5远程主机批量执行命令
#!/bin/bash
#auto scp files for client
#by authors wugk 2014
for i in `seq 100 200` do
ssh -l root 192.168.1.$i 'ls /tmp'
done
五、while语句
5.1判断数字
#!/bin/sh
i=1;
while [[ $i -lt 10 ]];do
echo $i; ((i++));
done;
5.2 read 命令
read -p 'Please Input number:' input
输入一个数字
echo $input
5.3逐行读取文件
#!/bin/sh
while read line
do
echo $line;
done </etc/hosts
文件:
结果:
六、case语句
6.1 until
直到满足条件才退出
#!/bin/sh a=10;
until [[ $a -lt 0 ]];
do
echo $a;
((a--));
done;
6.2菜单选择
结果:
6.3 select选择语句
现在可以实现通过1、2、3来选择菜单了,而不是输入名称
七、数组和函数
先来定义一个一维数组:
A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义, 数组的值可以随机定义。如何来引用呢?
echo ${A[0]} ,代表引用第一个数组变量,结果会显示 test1, 数组引用从 0 开始,代表第一个数组,依次类推。
echo ${A[1]} ,代表引用第二个数组变量,结果会显示 test2, 数组引用也是从 0 开始计算的。
如何显示该数组所有参数呢? echo ${A[@]} 将显示所有参数 test1 test2 test3 。
如何显示该数组参数个数呢? echo ${#A[@]} 将显示该数组的参数
个数 3。
如果替换某个数组呢?例如替换第二个 test2 数组为 test5 :echo
${A[@]/test2/test5}
如何删除一个数组呢?例如删除 test3 数组命令为: unset A[2] ;echo ${A[@]} 查看效果。
案例一、
#!/bin/sh
#Auto Make KVM Virtualization #Auto config bond scripts
eth_bond()
{
NETWORK=(
HWADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk
'{print $1}'`
IPADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk
'{print $2}'`
NETMASK=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $3}'`
GATEWAY=`route -n|grep "UG"|awk '{print $2}'`
)
cat >ifcfg-bond0<<EOF DEVICE=bond0 BOOTPROTO=static
${NETWORK[1]}
${NETWORK[2]}
${NETWORK[3]} ONBOOT=yes TYPE=Ethernet NM_CONTROLLED=no EOF
案例二、
7.1 函数
函数的编写与调用:
八、sed和grep
8.1把168改成10
使用命令修改:
8.2在行首添加id+空格
8.3在行末添加空格+id
8.4在匹配到的上行或者下一行添加内容
8.5打印匹配到的行、打印第一行、打印1到5行
8.6找出最大的数字
将空格变成换行符:
排除空行:
排序:
取最小值和最大值:
8.7grep和grep -v
grep -v取没有匹配到的值。
8.8匹配以10开头的
匹配以11结尾的:
8.9匹配0-9:匹配a-z:
8.10匹配大写开头
8.11匹配ip
[(0到9匹配1到3次)+.] ----->匹配3次
最后还要匹配0-9一到3次,是为了防止192.165.3.这样的ip,以.结尾,而不是以数字结尾的非法ip
.
8.12打印匹配到的行号
8.13egrep,匹配11或者wuguangke
8.14awk打印第几列
8.15打印用户
也可以以:切割
8.16打印ip
8.16打印use
8.17打印时添加内容
$NF表示打印最后一列
8.18find命令
打印当前目录的文件、30天以前修改的,今天修改的。
大于20M的:
AWK SED GREP FIND四大剑客
九、linux系统全量和增量备份
全量备份:
备份的快照文件是/tmp/snapshot,备份的目录是/data/sh
现在,经过一段时间后,在/data/sh目录中增加了新的文件:
增量备份:
注意,快照文件必须是同一个才是增量备份,如果不是同一个快照文件,那么会进行全量备份
如果把这个目录删掉的话,先还原全量备份,再还原增量备份。
下面是实现周末进行完整备份,其它星期进行增量备份的脚本:
#!/bin/sh
#Automatic Backup Linux System Files #Author wugk 2013-11-22
#Define Variable 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 [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
echo -e "\033[32mThe $TARGET_DIR Created Successfully !\033[0m"
fi
#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 Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully !\033[0m"
fi
}
sleep 3 Full_Backup;Add_Backup
十、linux下自动化企业运维案例
10.1封IP,对于暴力访问的机器
安装:
一直输入错误的密码:
监控这个文件:
有很多失败的访问信息:
提取数据:
将这个IP加入防火墙,并且重启防火墙:
脚本:
10.2同步文件到其它服务器
创建文件:
脚本:
执行:
10.3远程批量执行命令
10.4 RSync+SSH批量自动化部署
创建一个文件:
执行命令:
现在将www1中的文件全部同步到www2了。
十一、服务监控检查脚本发送邮件告警
脚本分解:
上面的是list.txt中的,单个服务直接复制一份,改成$1即可
执行:
最后,在脚本前面添加参数检查:
十二、硬件信息收集
#!/bin/sh
#auto get system info #author wugk 2014-08-29
echo -e "\033[34m \033[1m" cat <<EOF
++++++++++++++++++++++++++++++++++++++++++++++
++++++++Welcome to use system Collect+++++++++
++++++++++++++++++++++++++++++++++++++++++++++ EOF
ip_info=`ifconfig |grep "Bcast"|tail -1 |awk '{print $2}'|cut -d: -f 2`
cpu_info1=`cat /proc/cpuinfo |grep 'model name'|tail -1 |awk -F: '{print $2}'|sed 's/^ //g'|awk '{print $1,$3,$4,$NF}'`
cpu_info2=`cat /proc/cpuinfo |grep "physical id"|sort |uniq -c|wc -l` serv_info=`hostname |tail -1`
disk_info=`fdisk -l|grep "Disk"|grep -v "identifier"|awk '{print $2,$3,$4}'|sed 's/,//g'`
mem_info=`free -m |grep "Mem"|awk '{print "Total",$1,$2"M"}'` load_info=`uptime |awk '{print "Current Load: "$(NF-2)}'|sed 's/\,//g'` mark_info='BeiJing_IDC'
echo -e "\033[32m----------------\033[1m"
echo IPADDR:${ip_info} echo HOSTNAME:$serv_info
echo CPU_INFO:${cpu_info1} X${cpu_info2} echo DISK_INFO:$disk_info
echo MEM_INFO:$mem_info echo LOAD_INFO:$load_info
echo -e "\033[32m-----------------------------\033[0m"
echo -e -n "\033[36mYou want to write the data to the databases? \033[1m" ;read ensure
if [ "$ensure" == "yes" -o "$ensure" == "y" -o "$ensure" == "Y" ];then
echo "-------------------------"
echo -e '\033[31mmysql -uaudit -p123456 -D audit -e ''' "insert into audit_audit_system values('','${ip_info}','$serv_info','${cpu_info1} \ X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')" '''\033[0m '
else
echo "wait exit. "
exit
fi
也可以将信息存入csv文件:
CREATE TABLE `audit_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`)
);