shell_常规小脚本

shell

 

1、检查Mysql的健康状态

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo “At time: `date` :MySQL is stop .”>> /日志路径
/etc/init.d/mysqld start
else
echo “MySQL server is running .”
fi

 

2、Nginx-日志切割

#!/bin/bash

# This script run at 00:00

# The Nginx logs path
year=`date +%Y`
month=`date +%m`
day=`date +%d`
logs_backup_path="/ceshi/shell/logs_backup/$year$month"
logs_path="/var/log/nginx"
logs_access="access"
logs_error="error"
pid_path="/run/nginx.pid"
nginx_pid="ps -ef | grep nginx | grep master |awk '{print $2}'"
[ -d $logs_backup_path ] || mkdir -p $logs_backup_path
date=`date +%Y%m%d`
mv ${logs_path}/${logs_access}.log  ${logs_backup_path}/${logs_access}_${date}.log
mv ${logs_path}/${logs_error}.log  ${logs_backup_path}/${logs_error}_${date}.log
#kill -USR1 $(cat /run/nginx.pid)
kill -USR1 $(cat /run/nginx.pid)

 

3、判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件

#!/bin/bash
dir=/tmp/run
[ -f $dir ] && mv $dir $dir.bak
[  -d $dir ] && rm -rf $dir/* || mkdir $dir

 

4、 输入一个文件的绝对路径,判断路径是否存在,而且输出是文件还是目录,如果是字符连接,还得输出是有效的连接还是无效的连接

#!/bin/bash
read -p "Input a path:" path
if [ -L $path -a -e $path ];then
echo "this is effective link"
elif [ -L $path -a ! -e $path ];then
echo "this is not effective link"
elif [ -d $path ];then
echo "this is a director"
elif [ -f $path ];then
echo "this is file"
elif [ -e $path ];then
echo "this is a other type file"
else
echo "the file is not exist"
fi

 

##5、交互模式要求输入一个ip,然后脚本判断这个IP 对应的主机是否 能ping 通,输出结果类似于:

Server 10.1.1.20 is Down! 最后要求把结果邮件到本地管理员root@localhost和mail01@localhost

方法一:
#!/bin/bash
read -p "输入IP地址:" ip
ping -c 2 $ip > /dev/null 2>&1
if [ $? -eq 0 ];then
 echo "Server $ip is OK. " |mail -s 'check server' root@localhost
else
 echo "Server $ip is Down!" |mail -s 'check server' root@localhost
fi
方法二:
#!/bin/bash
read -p "Input your ip:" ip
ping -c 1 $ip &>/dev/null
[ $? -eq 0 ] && echo "server $ip is ok"|mail -s "check server" root@localhost || echo "server $ip is down" |mail -s "check server" root@localhost

方法三:
#!/bin/bash
tmpfile=`mktemp`
mailaddr="root@localhost mail@localhost"
read -p "输入IP地址:" ip
ping -c 2 $ip > /dev/null 2>&1
if [ $? -eq 0 ];then
   echo "Server $ip is Up! " >> $tmpfile
else
   echo "Server $ip is Down!" >> $tmpfile
fi
cat $tmpfile
mail -s "ping server" $mailaddr < $tmpfile
rm -rf $tmpfile

方法四:
#!/bin/bash

rootmail="root@localhost"
tmpfile=`mktemp`
read -p "Input a ip : " ip

ping -c 1 "$ip" &>/dev/null

retval=$?

if [ $retval -eq  0 ];then
echo "Server $ip is up" > $tmpfile
else
echo "Server $ip is down" > $tmpfile
fi

cat $tmpfile
mail -s "ping result" $rootmail < $tmpfile
rm -rf $tmpfile

 

6、自动搭建NFS服务

#!/bin/bash
#关闭防火墙和selinux
service iptables stop
chkconfig iptables off
setenforce 0 &>/dev/null
echo "########防火墙和selinux已经关闭########"
#测试网络,配置内网yum源
ping -c 1 192.168.1.10 &>/dev/null
if [ $? -eq 0 ];then
   echo "########网络ok########"
else
  echo "########请检查你的网络########"
  exit
fi
wget -P /etc/yum.repos.d/ ftp://192.168.1.10/demo.repo &>/dev/null
#安装相关软件
yum -y install 'nfs*' rpcbind &> /dev/null && echo "########软件安装ok#######"
#发布共享目录并授权
read -p "Input your share dir:" dir
[ ! -d $dir ] && mkdir $dir -p
#授权
chmod 1777 $dir
read -p "Input your share host(192.168.0.0/24(ro)):" host
cat >> /etc/exports << end
$dir $host
end
#启动服务,开机自启动
service rpcbind restart &>/dev/null && echo "##########rpcbind服务启动成功#############"
service nfs restart &>/dev/null && echo "############nfs服务启动成功#############"
chkconfig rpcbind on
chkconfig nfs on
#测试验证
mkdir /u01 &>/dev/null
mount.nfs localhost:$dir /u01
[ $? -eq 0 ] && echo "nfs服务测试ok,可以正常使用!"
umount /u01

 

7、将/etc/passwd里的用户名分类,分为管理员用户,系统用户,普通用户

  • 分析:

    根据用户的uid来判断用户种类 2.用户的信息保存在/etc/passwd文件中,需要在该文件中获取UID 3.根据用户的uid去判断 管理员:root 0 统用户:1-499 ftp apache ... 65534 nfsnobody 普通用户:500-60000

    #!/bin/bash
    for i in `cat /etc/passwd|cut -d: -f1,3`
    do
    uid=`echo $i |cut -d: -f2`
    name=`echo $i |cut -d: -f1`
    [ $uid -eq 0 ] && echo $name >>/tmp/adminuser
    [ $uid -gt 0 -a $uid -lt 500 -o $uid -eq 65534 ] && echo $name >>/tmp/systemuser
    [ $uid -ge 500 -a $uid -ne 65534 ] && echo $name >>/tmp/normaluser
    done

 

8、写一个倒计时脚本,要求显示离2018年10月1日(国庆节)的凌晨0点,还有多少天,多少时,多少分,多少秒。

  • 分析

    1. 该脚本应该是一个死循环,除非当前系统时间等于10月1日的凌晨0点,要退出循环,并且打印国庆快乐 break

    2. 计算未来时间(10月1日的凌晨0点)和当前系统时间的时间差 时间单位相同并且以相同的时间为一个基准 需要定义2个变量: 现在时间和未来时间 date命令 -d %

      #!/bin/bash
     goal=`date +%s -d 20181001`
     
     while true 或者until false
     do
            now=`date +%s`
    if [ $[$goal-$now] -eq 0 ];then
    break
    fi
             day=$[($goal-$now)/86400]
             hour=$[($goal-$now)%86400/3600]
             minute=$[($goal-$now)%3600/60]
             second=$[($goal-$now)%60]
    clear
             echo "离2018年10月1日还有$day天:$hour时:$minute分:$second秒"
             sleep 1
     done
     echo "国庆节快乐!!!"9、写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。

 

9、写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。

  • 分析:

    1. 如何判断文件是空文件 -s 判断文件内容为非空;判断空文件则 ! -s eg:[ ! -s file ]

    2. 定义一个变量count=0来保存删除文件的个数,掌握四则运算 let count++ . 交互式定义变量让用户自己决定清理哪个目录 /data/logs/ 10个文件 循环次数由目录里的文件个数决定

#!/bin/bash
read -p "输入一个你要删除空文件的目录:" dir

count=0
for i in `find $dir -type f`
do
[ ! -s $i ] && rm -rf $i && let count++     ##-s表示非空
done

echo "删除的个数为:" $count

 

10、写一个自动检测磁盘使用率的脚本,当磁盘使用空间达到90%以上时,需要发送邮件给相关人员

方法一:
#!/bin/bash
#Name:check_space.sh
#Desc:check disk space
#Path:/root/Desktop/check_space.sh
#Usage:./check_space.sh or /root/Desktop/check_space.sh
#Update:2016.06.11
/bin/df -h > df.txt
use=`cat df.txt|awk '{print $5}'|grep -o '[0-9]+'`
for i in $use
 do
  [ $i -ge 90 ] && echo notice disk space:`grep $i df.txt` |mail amy
done
rm -f df.txt

或者
....
use=`cat df.txt|awk '{if(NR>=2) print $5}'|sed -n 's/%//p'`

方法2:
#!/bin/bash
#自动检测磁盘使用率,达到90%以上发送邮件
#/shell05/use.sh
use=`df -h | awk -F'[ %]+' '//$/{print $5}'`
log=/tmp/use.log
if [ $use -ge 90 ];then
echo "当前磁盘使用率为$use%">$log
mail -s "磁盘监控报警" root@localhost <$log
fi

 

11、写一个脚本监控系统内存和交换分区使用情况

方法一:
#!/bin/bash
OIFS=$IFS 初始化默认分隔符
IFS=" " 定义默认分隔符
file=`free -m|sed -nr '/Mem|Swap/p'|awk '{print $4,$2}'`
mem=`echo $file|head -1`
swap=`echo $file|tail -1`
 echo $mem |awk '{if(($1/$2)*100<=50) print "物理内存空间需要留意,剩余"$1"M";else print "物理内存在正常范围"}'
 echo $swap |awk '{if(($1/$2)*100<=50) print "交换空间需要留意,剩余"$1"M";else print "交换空间在正常范围"}'
 

方法二:
#!/bin/bash
#监控系统内存和交换分区使用情况
#/shell05/free.sh
#取当前时间
date >> /tmp/date.txt
#取物理内存free值
echo "Mem-free:`free -m | grep Mem | awk '{print $4}'`M" >> /tmp/mem-free.txt
#取缓冲区free值
echo "buffers/cache-free:`free -m | grep - | awk '{print $4}'`M" >> /tmp/buffers-free.txt
#取Swap区free值
echo "Swap-free:`free -m | grep Swap | awk '{print $4}'`M" >> /tmp/swap-free.txt
#将时间与相关数据重新写入新文件
paste /tmp/date.txt /tmp/mem-free.txt /tmp/buffers-free.txt /tmp/swap-free.txt > /tmp/free.txt
#发送监控邮件
mail -s "内存监控报告" root@localhost < /tmp/free.txt

 

12、输入一个IP地址,使用脚本判断其合法性:必须符合ip地址规范,第1、4位不能以0开头,不能大于255不能小于0

1. 必须符合ip地址规范,第1、额、4位不能以0开头,不能大于255不能小于0
#!/bin/bash
read -p "请输入IP地址:" IP
#判断所输入的ip地址格式(数字并且是以点分割的4段)
if [[  "$IP"  =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]];then
       ip1=`echo $IP| cut -d. -f1`
       ip2=`echo $IP| cut -d. -f2`
       ip3=`echo $IP| cut -d. -f3`
       ip4=`echo $IP| cut -d. -f4`
else
  echo "IP wrong!!!" && exit
fi
#判断所输入的ip第1、4段都不能以0开头;第2、3段可以是0
if [[ "$ip1" =~ ^0 ]] || [[ "$ip4" =~ ^0 ]];then
 echo "IP is wrong!" && exit
 elif [[ "$ip2" =~ ^0. ]] || [[ "$ip3" =~ ^0. ]];then
 echo "IP is wrong!!" && exit
fi

#判断所输入的ip的范围0~255之间
for i in $ip1 $ip2 $ip3 $ip4
 do
   if [ $i -lt 0 -o $i -ge 255 ];then
      echo "ip is not ok" && exit
    else
      continue
   fi
done
#以上条件都不满足则是符合规范的ip
echo "IP is ok!"

 

13、FTP服务

仅供参考:
#!/bin/bash
ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:(.*) Bcast.*/1/g'`
iptail=`echo $ipaddr|cut -d'.' -f4`
ipremote=192.168.1.10
#修改主机名
hostname server$iptail.uplook.com
sed -i "/HOSTNAME/cHOSTNAME=server$iptail.uplook.com" /etc/sysconfig/network
echo "$ipaddr server$iptail.itcast.cc" >>/etc/hosts
#关闭防火墙和selinux
service iptables stop
setenforce 0 >/dev/null 2>&1
sed -i '/SELINUX=/cSELINUX=disabled' /etc/selinux/config
#配置yum源(一般是内网源)
#test network
ping -c 1 $ipremote > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "你的网络不通,请先检查你的网络"
exit 1
else
echo "网络ok."
fi
cat > /etc/yum.repos.d/server.repo << end
[server]
name=server
baseurl=ftp://$ipremote
enabled=1
gpgcheck=0
end
#安装软件
read -p "请输入需要安装的软件,多个用空格隔开:" soft
yum -y install $soft &>/dev/null

#备份配置文件
conf=/etc/vsftpd/vsftpd.conf
cp $conf $conf.default
#根据需求修改配置文件
sed -ir '/^#|^$/d' $conf
sed -i '/local_enable/clocal_enable=NO' $conf
sed -i '$a anon_upload_enable=YES' $conf
sed -i '$a anon_mkdir_write_enable=YES' $conf
sed -i '$a anon_other_write_enable=YES' $conf
sed -i '$a anon_max_rate=512000' $conf
#启动服务
service vsftpd restart &>/dev/null && echo"vsftpd服务启动成功"
#测试验证
chmod 777 /var/ftp/pub
cp /etc/hosts /var/ftp/pub
#测试下载
cd /tmp
lftp $ipaddr <<end
cd pub
get hosts
exit
end

if [ -f /tmp/hosts ];then
echo "匿名用户下载成功"
rm -f /tmp/hosts
else
echo "匿名用户下载失败"
fi
#测试上传、创建目录、删除目录等
cd /tmp
lftp $ipaddr << end
cd pub
mkdir test1
mkdir test2
put /etc/group
rmdir test2
exit
end

if [ -d /var/ftp/pub/test1 ];then

 

14、如何将跳板机山上的用户的公钥推送到局域网内可以ping通的所有主机上?

  • 分析:

    环境: 1、跳板机上有一个将要推送公钥的用户存在 例如:yunwei 2、检测当前局域网中哪些ip是能ping通哪些是不能ping通的 循环语句并发的去检查 3、在脚本中所有的交互动作都需要用到expect实现 yunwei用户sudo授权: visudo

    Allow root to run any commands anywhere

    root ALL=(ALL) ALL yunwei ALL=(root) NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /

#!/bin/bash
#检查局域网中哪些ip是可以ping通,并保存到一个文件
ip1=10.1.1
for ((i=1;i<=10;i++))
do
{
     ping -c1 $ip1.$i &>/dev/null
    [ $? -eq 0 ] && echo "$ip1.$i" >> ip_up.txt
}&
done
wait

#yunwei用户生成一对秘钥(有交互)
[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa

#将yunwe用户的公钥远程拷贝到指定的服务器 100 循环
##判断expect程序是否安装
{
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect
while read ip2
do
/usr/bin/expect<<-EOF
spawn ssh-copy-id root@$ip2
expect {
     "yes/no" {send "yes ";exp_continue}
     "password:" {send "123 "}
    }
expect eof
EOF
done<ip_up.txt
} &>/dev/null

#测试验证
remote_ip=`tail -1 ip_up.txt`
ssh root@$remote_ip hostname
[ $? -eq 0 ] && echo "公钥推送完毕...."



#!/bin/bash
#push publickey to aap-servers
#将局域网内可以ping通的主机ip保存到一个文件
> ip_up.txt
for i in {2..10}
do
{
ip=10.1.1.$i
ping -c1 $ip &>/dev/null
[ $? -eq 0 ] && echo $ip |tee -a ip_up.txt
}& //并行放到后台运行
done
wait //等待进程结束
#将yunwei用户目录下的公钥推送到可以ping的服务器上
#1. 判断yunwei用户下有没有公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa

#2.将id_rsa.pub公钥远程推送到指定服务器
#2.1 判断expect程序是否安装,没安装则安装它
{
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect

for remote_ip in `cat ip_up.txt`
do
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$remote_ip
expect {
    "yes/no" { send "yes ";exp_continue }
    "password:" { send "123 " }
}
expect eof
EOF
done
} &>/dev/null
#测试验证
test_ip=`tail -1 ip_up.txt`
ssh root@$test_ip hostname
test $? -eq 0 && echo "公钥推送成功。"


优化后的脚本:
#!/bin/bash
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect
for i in {130..140}
do
       ip=192.168.44.$i
       ping -c1 $ip
      [ $? -ne 0 ] && continue
       echo $ip >>ip_up.txt
      /usr/bin/expect <<-EOF
      spawn ssh-copy-id root@$ip
      expect {
       "yes/no" { send "yes ";exp_continue }

       "password:" { send "123456 " }
      }
      expect eof
      EOF
done
#测试验证
test_ip=`tail -1 ip_up.txt`
ssh root@$test_ip hostname
test $? -eq 0 && echo "公钥推送成功。"

 

15、写一个脚本,统计web服务的不同连接状态个数

#!/bin/bash
#count_http_80_state
#统计每个状态的个数
declare -A STATE
states=`ss -ant|grep 80|cut -d' ' -f1`
for i in $states
do
      let STATE[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in ${!STATE[@]}
do
       echo $j:${STATE[$j]}
done

 

16、写一个30秒同步一次时间,向服务器10.1.1.250的脚本,如果同步失败,则进行邮件报警,每次失败都报警;同步成功,也进行邮件通知,但是成功100次才通知一次?

  • ntp-server:10.1.1.250 web-cluster:10.1.1.1 10.1.1.2 10.1.1.3

  • 分析

    计划任务时间最小的是分钟,所以不能直接使用crontab完成,那么需要写脚本 脚本每隔30s同步,该脚本是死循环。并且sleep30来控制间隔。

#!/bin/bash
#定义相关变量
ntp-server=10.1.1.250
count=0
until false
do
ntpdate $ntp-server &>/dev/null
if [ $? -ne 0 ];then
  echo "系统时间同步失败" |mail -s "check system date" root@localhost
else
let count++
if [ $count -eq 100 ];then
echo "系统时间同步成功100次"|mail -s "check system date" root@localhost && count=0
fi
fi
sleep 30
done
或者
#!/bin/bash
#ntpdate
count=0
ip=10.1.1.1
while true
do
rdate -s $ip &>/dev/null
if [ $? -ne 0 ];then
echo "时间同步失败,请检查..." |mail -s "check system times" root@MissHou.itcast.cc
else
let count++
[ $[$count%100] -eq 0 ] && echo "时间同成功" |mail -s "check system times" root@MissHou.itcast.cc && count=0
fi
sleep 30
done

 

17、自动搭建apache服务的脚本

  • 要求如下: 1、用户输入web服务器的ip、域名以及数据根目录 2、如果用户不输入则一直提示输入,直到输入为止 3、当访问www.tesst.cc时可以访问到数据根目录里的首页文件“this is test page”

#!/bin/bash
#定义函数实现用户不输入则一直提示输入,直到输入为止
input_fun(){
       input_var=''
       while [ -z $input_var ]
               do
              read -p "$1" input_var
               done
               echo $input_var
}
#调用函数并且获取用户输入web服务器的IP、域名以及数据根目录
IP=`input_fun 请输入你的IP地址:`
name=`input_fun 请输入你的域名:`
dir=`input_fun 请输入你的数据根目录:`
#将ip与主机名输入到/etc/hosts文件里
cat >>
/etc/hosts <<-a
$ip $name
a
#创建数据根目录和首页文件
[ -f $dir ] && mv $dir $dir.bak
[ ! -d $dir ] && mkdir -p $dir
echo "this is $name test page" > $dir/index.httml
#yum安装apache
yum -y install httpd &>/dev/null
#发布虚拟主机
cat
/ettc/httpd/conf/httpd.coonf <<-a
NameVirtualHost *:80
<VirtualHost *:80>
  ServerAdmin webmaster@dummy-host.example.com
  DocumentRoot $dir
  ServerName $name
  ErrorLog logs/dummy-host.example.com-error_log
  CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
a
#启动apache
service apache restart &>/dev/null
echo "apache启动成功"
#测试验证
curl http://$name

 

18、判断一个进程是否存在

#!/bin/bash
read -p "请输入需要判断的进程名(vsftpd):" pid
ps -ef|grep $pid|grep -v 'grep' &>/dev/null
或者
pgrep -l $pid &>/dev/null
[ $? -eq 0 ] && echo "该进程$pid存在" || echo "该进程不存在"

 

19、12、批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123

#!/bin/bash
#判断class组是否存在
cut -d: -f1 /etc/group|grep -w class &>/dev/null
[ $? -ne 0 ] && groupadd class

#循环增加用户,循环次数5次,for循环,给用户设定密码
for ((i=1;i<=5;i++))
do
useradd u$i -G class
echo 123|passwd --stdin u$i
done



#!/bin/bash
grep -w class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
或者
groupadd class &>/dev/null

for ((i=1;i<=5;i++))
do
useradd -G class u$i && echo 123|passwd --stdin u$i
Done

 

20、批量新建5个用户stu1-stu5,要求这几个用户的家目录都在rhome:提示需要判断该目录是否存在。

#!/bin/bash
#判断/rhome目录是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
[ ! -d /rhome ] && mkdir /rhome
或者
[ -d /rhome ] || mkdir /rhome
#批量创建用户
for i in {1..5}
do
useradd stu$i -d /rhome/stu$i
echo 123|passwd --stdin stu$i
Done

 

21、批量创建5个用户,每个用户的密码为一个随机数。

  • 思路:

    循环5次创建用户

    产生一个密码文件来保存用户的随机密码

    从密码文件中取出随机密码赋值给用户

#!/bin/bash
#crate user and set passwd
#产生一个保存用户名和密码的文件
echo user0{1..3}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' ' '>> user_pass.file
#循环创建5个用户
for ((i=1;i<=5;i++))
do
user=`head -$i user_pass.file|tail -1|cut -d: -f1`
pass=`head -$i user_pass.file|tail -1|cut -d: -f2`
useradd $user
echo $pass|passwd --stdin $user
done

或者
for i in `cat user_pass.file`
do
user=`echo $i|cut -d: -f1`
pass=`echo $i|cut -d: -f2`
useradd $user
echo $pass|passwd --stdin $user
done

#!/bin/bash
#crate user and set passwd
#产生一个保存用户名和密码的文件
echo user0{1..3}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' ' '|tr ':' ' ' >> user_pass.file
#循环创建5个用户
while read user pass
do
useradd $user
echo $pass|passwd --stdin $user
done < user_pass.file

22、Apache的log的清理

  • apache日志每天进行轮转:

    vim /usr/local/apache2/conf/extar/httpd-vhosts.conf ... ErrorLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_log-%Y%m%d 86400" CustomLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_log-%Y%m%d 86400" common ...

    说明:

    1. rotatelogs程序是apache自带的一个日志切割工具。 -l参数表示使用本地系统时间为标准切割,而不是GMT时区时间。

    2. /usr/local/apache2/logs/access_log-%Y%m%d 86400 用来指定日志文件的位置和名称,其中86400用来指定分割时间默认单位为s,也就是24小时;

     

    log-server上搭建rsync: [root@log-server ~]# cat /etc/rsyncd.conf [web1] path = /web1/logs uid = root gid = root read only = false

    [web2] path = /web2/logs uid = root gid = root read only = false

echo rsync --daemon >> /etc/rc.local

web服务器上定义清理脚本

#!/bin/bash
#clean log
clean_log(){
remote_log_server=10.1.1.2
server=$1
log_dir=/usr/local/apache2/logs
log_tmp_dir=/tmp/log
host=`ifconfig eth0|sed -n '2p'|awk -F'[ :]+' '{print $4}'`


[ ! -d $log_tmp_dir ] && mkdir -p $log_tmp_dir

cd $log_dir
find ./ -daystart -mtime +3 -exec tar -uf $log_tmp_dir/`echo $host`_$(date +%F).tar {} ;
find ./ -daystart -mtime +3 -delete

cd $log_tmp_dir
rsync -a ./ $remote_log_server::$server && find ./ -daystart -mtime +1 -delete
}


jumper-server:

#!/bin/bash
#jumper-server
#菜单打印
trap '' 1 2 3
menu1(){
cat <<-END
请选择对web1的操作类型:
1. clean_apache_log
2. reload_apache_service
3. test_apache_service
4. remote login
END
}
menu2(){
cat <<-END
欢迎使用Jumper-server,请选择你要操作的主机:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
5. exit
END
}

push_pubkey(){
ip=$1
# 判断公钥文件是否存在,没有则生成公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
# 安装expect程序,与交互式程序对话(自动应答)
sudo rpm -q expect &>/dev/null
test $? -ne 0 && sudo yum -y install expect
#将跳板机上yunwei用户的公钥推送的指定服务器上
/usr/bin/expect<<-EOF
spawn ssh-copy-id -i root@$ip
expect {
"yes/no" { send "yes ";exp_continue }
"password:" { send "111111 " }
}
expect eof
EOF

}
while true
do
menu2
#让用户选择相应的操作
read -p "请输入你要操作的主机:" host
case $host in
1)
ssh root@10.1.1.2
;;
2)
ssh root@10.1.1.3
;;
3)
clear
menu1
read -p "请输入你的操作类型:" types
case $types in
1)
ssh root@10.1.1.1 clean_log web1
test $? -eq 0 && echo "日志清理完毕..."
;;
2)
service apache reload
;;
3)
wget http://10.1.1.1 &>/dev/null
test $? -eq 0 && echo "该web服务运行正常..." || echo "该web服务无法访问,请检查..."
;;
4)
ssh root@10.1.1.1
;;
"")
:
;;
esac
;;
5)
exit
;;
*)
clear
echo "输入错误,请重新输入..."
;;
esac
done

 

23、使用xtrabackup工具对mysql数据库进行增量备份

#!/bin/bash
# Name: xtra_back_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_back_mysql.sh
# Author:MissHou
# Update:2018-08-05

# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备


#变量定义
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
conf_file=/usr/local/mysql/my.cnf
xtra_full_dir=/mydb3307/back_full
xtra_increment_dir=/mydb3307/back_increment
xtr_full_log=/mydb3307/log/full_$(date +%F).log
xtr_increment_log=/mydb3307/log/increment_$(date +%F).log



#全量备份
full_back()
{

#备份
/usr/bin/innobackupex --user=admin --password=123 $xtra_full_dir &> $xtr_full_log
full_name=$(ls -d $xtra_full_dir/$(date +%F)_*)
echo $full_name > $xtra_full_dir/full.txt

#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_full_log
/usr/bin/innobackupex --apply-log --redo-only $full_name &>> $xtr_full_log

}

full_back && find $xtra_full_dir -daystart -type d -mtime +1 -exec rm -rf {} ; 2>/dev/null

 

24、显示系统使用的以下信息:主机名、IP地址、子网掩码、网关、DNS服务器IP地址信息

#!/bin/bash
IP=`ifconfig eth0 | head -2 | tail -1 | awk '{print $2}' | awk -F":" '{print $2}'`
ZW=` ifconfig eth0 | head -2 | tail -1 | awk '{print $3}' | awk -F":" '{print $2}'`
GW=`route -n | tail -1 | awk '{print $2}'`
HN=`hostname`
DNS=`head -1 /etc/resolv.conf | awk '{print $2}'`
echo '此机IP地址是' $IP
echo '此机子网掩码是' $ZW
echo '此机网关是' $GW
echo '此机主机名是' $HN
echo '此机DNS是' $DNS

 

25、数据库定时备份

  • 要求

    每周日半夜23点半,对数据库服务器上的webdb库做完整备份每备份文件保存到系统的/mysqlbak目录里用系统日期做备份文件名 webdb-YYYY-mm-dd.sql每次完整备份后都生成新的binlog日志把当前所有的binlog日志备份到/mysqlbinlog目录下

#mkdir /mysqlbak 
#mkdir /mysqlbinlog
#service mysqld start
cd /shell
#vi webdb.sh
#!/bin/bash
day=`date +%F`
mysqldump -hlocalhost -uroot -p123 webdb > /mysqlbak/webdb-${day}.sql
mysql -hlocalhost -uroot -p -e "flush logs"
tar zcf /mysqlbinlog.tar.gz /var/lib/mysql/mysqld-bin.0*
#chmod +x webdb.sh
#crontab -e
30 23 * * 7 /shell/webdb.sh

 

26、检查任意一个服务的运行状态

方法1:使用read写脚本
#!/bin/bash
read -p "请输入你的服务名:" service
if [ $service != 'crond' -a $service != 'httpd' -a $service != 'sshd' -a $service != 'mysqld' -a $service != 'vsftpd' ];then
echo "只能够检查'vsftpd,httpd,crond,mysqld,sshd"
exit 5
fi
service $service status &> /dev/null

if [ $? -eq 0 ];thhen
echo "服务在线"
else
service $service start
fi



方法2:使用位置变量来写脚本
if [ -z $1 ];then
echo "You mast specify a servername!"
echo "Usage: `basename$0` servername"
exit 2
fi
if [ $1 == "crond" ] || [ $1 == "mysql" ] || [ $1 == "sshd" ] || [ $1 == "httpd" ] || [ $1 == "vsftpd" ];then
service $1 status &> /dev/null
if [ $? -eq 0 ];then
echo "$1 is running"
else
service $1 start
fi
else
echo "Usage:`basename $0` server name"
echo "But only check for vsftpd httpd sshd crond mysqld" && exit2
fi

 

27、检查mysql主从从结构中从数据库服务器的状态

  • 要求

    1)本机的数据库服务是否正在运行

    2)能否与主数据库服务器正常通信

    3)能否使用授权用户连接数据库服务器

    4)本机的slave_IO进程是否处于YES状态      本机的slave_SQL进程是否处于YES状态

#!/bin/bash
netstat -tulnp | grep :3306 > /dev/nullif [ $? -eq 0 ];
thenecho "服务正在运行" elseservice mysqld startfiping -c 3 192.168.1.100 &> /dev/nullif [ $? -eq 0 ];
thenecho "网络连接正常" elseecho "网络连接失败"fimysql -h192.168.1.100 -uroot -p123456 &> /dev/nullif [ $? -eq 0 ];
thenecho "数据库连接成功" elseecho "数据库连接失败"fiIO= mysql -uroot -p123 -e "show slave statusG" | grep Slave_IO_Running | awk '{print $2}' > /dev/nullSQL= mysql -uroot -p123 -e "show slave statusG" | grep Slave_SQL_Running | awk '{print $2}' /dev/nullif [ IO==Yes ] && [ SQL==Yes ];
thenecho “IO and SQL 连接成功”elseecho "IO线程和SQL线程连接失败"fi

 

28、监控CPU利用率

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig etn0 | awk -F '[ :]+' '/inet /addr/{print $4}') #只支持Centos6
MAIL="example@mail.com"
if ! which vmstat & > /dev/null; then
    echo "vmstat command no fond, Please install proces package."
    exit 1
fi

US=$(vmstat | awk 'NR==3{print $13}')
SY=$(vmstat | awk 'NR==3{print $14}')
IDLE=$(vmstet |awk 'NR==3{print $15}')
WAIT=$(vmstat | awk 'NR==3{print $16}')
USE=$(($US+$SY))
if [ $USE -ge 50 ]; then
  echo "
    Date:$DATE
    Host:$IP
    Prblem: CPU utilization $USE" | mail -s "CPU Monitor" $MAIL
fi

 

29,写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上

#!/bin/bash
#push publickey to aap-servers
#将局域网内可以ping通的主机ip保存到一个文件
> ip_up.txt
for i in {2..10}
do
{
ip=10.1.1.$i
ping -c1 $ip &>/dev/null
[ $? -eq 0 ] && echo $ip |tee -a ip_up.txt
}& //并行放到后台运行
done
wait //等待进程结束
#将yunwei用户目录下的公钥推送到可以ping的服务器上
#1. 判断yunwei用户下有没有公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa

#2.将id_rsa.pub公钥远程推送到指定服务器
#2.1 判断expect程序是否安装,没安装则安装它
{
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect

for remote_ip in `cat ip_up.txt`
do
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$remote_ip
expect {
    "yes/no" { send "yes ";exp_continue }
    "password:" { send "123 " }
}
expect eof
EOF
done
} &>/dev/null
#测试验证
test_ip=`tail -1 ip_up.txt`
ssh root@$test_ip hostname
test $? -eq 0 && echo "公钥推送成功。"

 

30,统计web服务的不同连接状态个数

#!/bin/bash
#count_http_80_state
#统计每个状态的个数
declare -A state
states=`ss -ant|grep 80|cut -d' ' -f1`
for i in $states
do
      let state[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in ${!state[@]}
do
       echo $j:${state[$j]}
done

 

31,自动搭建apache的脚本

要求:
1、用户输入web服务器的IP、域名以及数据根目录

2、如果用户不输入则一直提示输入,直到输入为止

3、当访问www.test.cc时可以访问到数据根目录里的首页文件“this is test page”

代码:
#!/bin/bash
#定义函数实现用户不输入则一直提示输入,直到输入为止
input_fun(){
       input_var=''   用户自己要输入的内容(ip、域名、数据根目录)
       while [ -z $input_var ]
               do
              read -p "$1" input_var
               done
               echo $input_var
}
#调用函数并且获取用户输入web服务器的IP、域名以及数据根目录
IP=`input_fun 请输入你的IP地址:`
name=`input_fun 请输入你的域名:`
dir=`input_fun 请输入你的数据根目录:`
#将ip与主机名输入到hosts文件里
cat>>/etc/hosts<<EOF
$IP $name
EOF
#创建数据根目录和首页文件
[ -f $dir ] && mv $dir $dir.bak
[ ! -d $dir ] && mkdir -p $dir
echo "this is $name test page" > $dir/index.html
#yum安装apache
yum -y install httpd &>/dev/null
#发布虚拟主机
cat>>/etc/httpd/conf/httpd.conf<<-EOF
NameVirtualHost *:80
<VirtualHost *:80>
  ServerAdmin webmaster@dummy-host.example.com
  DocumentRoot $dir
  ServerName $name
  ErrorLog logs/dummy-host.example.com-error_log
  CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
EOF
#启动
service httpd restart &>/dev/null
echo "====apache启动成功====":
#测试验证
curl http://$name

 

32、apache的日志只保留3天以内的

  • 任务背景

    web服务器集群中总共有9台机器,上面部署的是Apache服务。由于业务不断增长,每天每台机器上都会产生大量的访问日志,现需要将每台web服务器上的apache访问日志保留最近3天的,3天以前的日志转储到一台专门的日志服务器上,已做后续分析。如何实现每台服务器上只保留3天以内的日志?

  • 具体要求

    1. 每台web服务器的日志对应日志服务器相应的目录里。如:web1——>web1.log(在日志服务器上)

    2. 每台web服务器上保留最近3天的访问日志,3天以前的日志每天凌晨5:03分转储到日志服务器

    3. 如果脚本转储失败,运维人员需要通过跳板机的菜单选择手动清理日志

33、数据库备份脚本,需求:保存15天,假定我们知道数据库root的密码,要备份的库为discuz本地备份的目录为/bak/mysql

1、备份数据库
mysqldump -uroot -p密码 discuz >/bak/mysql/test.${DATE}.sql

2、只保留15天备份
①在终端命令行创建要备份的脚本

vi delsqlbut15day.sh
脚本内容:
#!/bin/bash
cd /bak/mysql
#保存的天数减1,目前保存15天
oldDate=$(date -d "14 day ago" "+%y%m%d")
#匹配.sql结尾文件
for i in `find . -maxdepth 1 -type f|grep .sql$`;do
#echo $oldDate   (测试输出$i)
#从倒数开始第4个字符匹配6位
  if [[ "${i:0-10:6}" < "$oldDate" ]];
  then
       rm -rf $i &
#echo $i (测试输出$i)
  fi
done
②给脚本执行权限
chmod 744 delsqlbut15day.sh
③执行脚本
bash delsqlbut15day.sh & 或者 sh delsqlbut15day.sh & 或者 ./delsqlbut15day.sh &

 

 

 

 

坚持这种真诚,那么总归能遇到良人。
原文地址:https://www.cnblogs.com/jiaxiaozia/p/12157385.html