多进程脚本、系统初始化脚本、综合应用脚本

1 案例1:系统初始化

编写一个脚本可以匹配不同系统的服务器(包含7版本与8版本的系统)实现以下需求:

1,所有服务器永久关闭防火墙服务和SELinux

2,关闭7版本系统的命令历史记录,修改8版本的命令历史记录最多保存2000条并加上时间戳

3,关闭8版本系统的交换分区

4,定义root远程登录系统后的ssh保持时间为300秒

5,设置时间同步,ntp服务器地址是192.168.88.240

    #!/bin/bash
    #脚本执行完后,用ssh远程登录测试
    #可以先手工备份/etc/fstab和/etc/profile
    #1)判断当前账户身份,并关闭防火墙与selinux
    [ $UID -ne 0 ] && echo "请使用管理员操作" && exit
    systemctl stop firewalld                 
    systemctl disable firewalld
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    #2)根据不同版本的系统执行各自的任务
    egrep -q "\s+8\.[0-9]" /etc/redhat-release                    #判断系统版本
    if [ $? -ne 0 ];then
        sed -ri 's/HISTSIZE=[0-9]+/HISTSIZE=0/' /etc/profile        #关闭历史命令
    else
        sed -ri 's/HISTSIZE=[0-9]+/HISTSIZE=2000/' /etc/profile        #历史命令2000条
        sed -i '/^export /i HISTTIMEFORMAT="%F %T "' /etc/profile    #历史命令时间戳
        sed -i '/^export /s/$/ HISTTIMEFORMAT/' /etc/profile        #找到export开头那行,在最后加 HISTTIMEFORMAT,可以在子进程中也显示时间戳
        swap=$(swapon | awk 'NR!=1{print $1}')                #找到交换分区
        for i in $swap
        do
            swapoff $i                                        #循环关闭交换分区
        done
        sed -i '/swap/s/^/#/' /etc/fstab                    #关闭交换分区自动挂载
    fi
    #3)最后所有机器设置ssh超时时间与时间同步
    echo "export TMOUT=300"  >> ~/.bash_profile                #定义ssh超时退出时间
    yum -y install chrony
    systemctl enable chronyd
    sed  -ri  '/^(pool|server).*iburst/s/^/#/'   /etc/chrony.conf
    sed  -i  '1i server 192.168.88.240 iburst'   /etc/chrony.conf
    systemctl restart chronyd

2 文档处理

首先要了解:

< 符号,输入重定向,可以在后面需要跟文件名,这样让程序不再从键盘读取数据,而是从文件中读取数据。

    mail -s test root  <  /opt/mail.txt

<< 符号也称Here Document,代表你需要的内容在这里,某指令导入字符串时使用,而无需文件

    mail -s test root << EOF
    hello
    test mail~
    EOF

使用read指令配合输入重定向可同时定义多个变量

    read  a b    
    abc xyz                    #同时为变量a赋值abc,变量b赋值xyz 
    read  a b  <  abc.txt        #利用abc.txt文档内容赋值,仅读取第一行

结合while循环批量读取数据并通过read命令给变量赋值

    while read a b 
    do
        echo  $a  $b
    done < abc.txt            #利用abc.txt文档内容赋值,读取所有行

根据文档内容,创建账户并同时配置密码

首先准备测试文档user.txt

研发部

zhangsan haha123

人事部

lisi xixi456

wangwu lele789

销售部

zhaoliu kaka765

    #!/bin/bash
    while read  name pass
    do
        [ -z $pass ] && continue            #如果没有密码则不创建,那个是部门的名字的行
        useradd $name
        echo $pass | passwd --stdin $name
    done < user.txt

3 案例2:通过文档批量创建账户并配置密码

系统中的/dev/urandom可以获得取之不尽的随机字符,但内容太随意有些是不需要的,如果文档中没有密码,可以使用tr处理这些随机字符获取密码

    tr -cd '_a-zA-Z0-9' < /dev/urandom | head -c 10     #-c是取反 -d是删除,对_a-zA-Z0-9取反删除,剩下就只是_a-zA-Z0-9这个范围内的字符串,head -c 10 可以得到10位字符

编写脚本:

    #!/bin/bash
    x=$(awk '/^[a-zA-Z0-9]/&&!/已创建/{print NR}' user.txt)
    if [ -z "$x" ];then
        echo "没有新用户需要创建"
        column -t user.txt
        exit
    fi
    for i in $x
    do
        pass=$(strings /dev/urandom | tr -cd '_a-zA-Z0-9' | head -c 10)
        sed -i "${i}s/$/\t$pass/"  user.txt
        read name pass << EOF
        $(sed -n "${i}p" user.txt)
    EOF
        useradd $name
        echo $pass | passwd --stdin $name
        sed -i "${i}s/$/\t已创建/"  user.txt
    done
    column -t user.txt

4 制作菜单

4.1 步骤

实现此案例需要按照如下步骤进行。

步骤一:

    #vim menu                #创建菜单函数文件
    x=1                    #高亮行号,默认为1即可
    y=0                    #第几行
    menu (){                #循环显示菜单的函数
        clear
        for i in 1,安装ftp服务 2,开关ftp服务 3,退出
        do
            echo "----------------"
            let y++
            [ $x -eq $y ] && echo -e "\033[43;93m$i\033[0m" && continue
            echo "$i"
        done
        y=0
        echo "----------------"
    }

步骤二:可动菜单

$'\033[A'代表键盘的 "上" 按键

$'\033[B'代表键盘的 "下" 按键

    #vim ftp.sh
    #!/bin/bash
    . menu            #读入菜单函数
    while :
    do
        menu
        read -n 3 c    #-n 3是输入足够3个字符就自动进行下一步,c是存储字符的变量
        if [ "$c" == $'\033[A' ];then        #如果按了 "上" 键
            [ $x -eq 1 ] && continue        #根据变量x定义高亮行,在第1行就没变化
            let x--                        #如果不在第1行,就把x-1
        elif [ "$c" == $'\033[B' ];then    #如果按了 "下" 键
            [ $x -eq 3 ] && continue        #如果在第3行,没变化
            let x++                        #如果不在第3行,就把x+1        
        fi
    done

之后执行ftp.sh可以看到菜单,按键盘上下键菜单发生变化

5 案例3:制作菜单,可以控制vsftpd服务

本案例需要在上一实验的基础上完成

步骤一:

    #vim ftp_install            #创建ftp安装函数文件
    ftp_install(){
        if rpm -q vsftpd &> /dev/null ;then        #ftp如果已经安装则条件算成功
            msg="vsftpd已安装"                    #定义信息变量msg
        else
            yum -y install vsftpd &> /dev/null
            [ $? -eq 0 ] && msg="vsftpd安装成功" || msg="vsftpd安装失败"
        fi
    }

步骤二:

    #vim ser_manager            #创建服务管理函数文件
    ser_manager(){
        if ! rpm -q vsftpd &>/dev/null ;then    #ftp如果未安装则条件算成功,!是取反
            msg="未安装vsftpd软件包"
            return                                #结束函数任务,跳出函数
        fi
        case $1 in
        start)                                #调用本函数后追加start就是把服务开启
            systemctl start vsftpd
            msg="ftp服务已经启动"
            ser_manager=start;;
        stop)                                    #调用本函数后追加stop就是把服务关闭
            systemctl stop vsftpd
            msg="ftp服务已经关闭"
            ser_manager=stop;;
        esac
    }

步骤三:

继续完善主程序

    #vim ftp.sh
    #!/bin/bash
    . menu            #读入菜单函数
    . ftp_install        #读入安装函数
    . ser_manager        #读入服务管理函数
    while :
    do
        menu
        echo "$msg"
        read -n 3 c    #-n 3是输入足够3个字符就自动进行下一步,c是存储字符的变量
        if [ "$c" == $'\033[A' ];then        #如果按了 "上" 键
            [ $x -eq 1 ] && continue        #根据变量x定义高亮行,在第1行就没变化
            let x--                        #如果不在第1行,就把x-1
        elif [ "$c" == $'\033[B' ];then    #如果按了 "下" 键
            [ $x -eq 3 ] && continue        #如果在第3行,没变化
            let x++                        #如果不在第3行,就把x+1
        elif [ -z $c ] && [ $x -eq 1 ];then        #如果在第1行回车就执行下列任务
            msg="ftp服务安装中。。。"
            echo "$msg"
            ftp_install                        #执行ftp_install函数的任务
        elif [ -z $c ] && [ $x -eq 2 ];then        #如果在第2行回车就执行下列任务
            [ "$ser_manager" != "start" ] && ser_manager start || ser_manager stop
        elif [ -z $c ] && [ $x -eq 3 ];then        #如果在第3行回车就执行下列任务
            exit
        fi
    done

6 安装ftp客户端

步骤一:

在服务端开启匿名上传

anon_upload_enable=YES

    #vim /etc/vsftpd/vsftpd.conf
    ...
    anon_upload_enable=YES
    ...

步骤二:

在客户端安装配置lftp并测试

    yum -y install lftp
    #vim /etc/lftp.conf                      #修改lftp配置
    set net:reconnect-interval-base 0        #重试时间0秒
    set net:max-retries 1                    #失败后是否重试,1不重试

测试

    lftp 192.168.99.5    
        cd  pub                            #切换目录
        mput test.txt                        #上传文件
        quit                                #退出

7 按要求每天备份文件

1.备份数据/var/www/html 里面除了.tmp类型的所有文件到/opt/backup_data

2.备份文件要带时间戳,打tar包,格式为web_file_年-月-日.tar.gz

3.如果/opt/backup_data中备份的tar包凑齐5个之后,就都上传到ftp中并删除本地的这些tar包

4.任务执行成功或失败都要给出提示信息

使用tar工具可以通过文件选择功能的--exclude对不需要文件进行排除

    #!/bin/bash
    sou_path=/var/www/html                #定义备份数据的目录变量
    tar_path=/opt/backup_data                #定义tar包存储目录变量
    date=$(date +%Y-%m-%d)                #时间格式变量
    ex_file=*.tmp                            #排除文件变量
    tar -zcf ${tar_path}/web_file_${date}.tar.gz --exclude=$ex_file  ${sou_path}
    file_total=$(ls ${tar_path} | wc -l)    #定义tar包总数变量
    echo "${date}的文件已打tar包放入${tar_path},目前备份文件总数是${file_total}个"
    if [ $file_total -ge 5 ];then
        lftp 192.168.99.5 << EOF
        cd  pub
        mput -q ${tar_path}/*                #上传时用-q可屏蔽信息输出
        quit
    EOF
        if [ $? -ne 0 ];then
            echo "上传ftp出错,请检查文件或服务"
            exit
        else
            rm -rf  ${tar_path}/web_file*
            echo "上传ftp成功!"
        fi
    fi

你可能感兴趣的:(服务器,运维,linux)