zoukankan      html  css  js  c++  java
  • 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 &

     

     

     

     

    坚持这种真诚,那么总归能遇到良人。
  • 相关阅读:
    第五章 数据的共享与保护
    实验6
    实验5
    实验4 类与对象2)
    实验三 类与对象
    实验2
    2018—3-21第二章程序例题(2)
    第二章思维导图
    2018—3-18C++第二章程序例题
    汇编实验九
  • 原文地址:https://www.cnblogs.com/jiaxiaozia/p/12157385.html
Copyright © 2011-2022 走看看