shell脚本实现Linux日志服务配置Edition 2

来源:互联网 发布:银行后台数据录入员 编辑:程序博客网 时间:2024/06/10 14:32

昨天刚才发表了shell脚本实现Linux日志服务配置Edition 1这篇博文

只过了一天第二个版本就已经诞生了!!!

本次改进:

代码量少了,比如像主机类型的选择等操作并入了参数中流程控制更加清晰有了一定的错误处理,用户更友好

其实这也很符合写程序的实际情况,首先可能要求是实现功能,然后就得精简代码、严谨逻辑并且提升程序性能。也不是懒得去修改上一篇博客,而是为了留下对比,没有今夕的对比怎么体现成长呢?当然所谓的成长对于程序员来说就是编程或者专业技能的提升这么回事。

不要管前面我说了什么,你是来看代码的吧

那么,上脚本

注:此脚本在redhat7.2上完全运行通过,对于其他类型Linux系统或者redhat其他版本差异请自寻!

此shell脚本实现的功能(包含客户端和服务器端)

  • Linux日志转储
  • Linux日志时间同步
  • Linux日志处理的脚本以及针对性设置
  • 时区设置
  • 日志相关服务的停启
#!/bin/bash#首先,我将在脚本开始给出一个友好的欢迎界面,此出于用户体验的考虑(我曾经可是一名web偏前端工程师啊)echo '-------------------------------------------------------------------------'echo '.                                                                       .'echo '.                  Welcome  to  rsyslogd service  setting               .'echo '.                                                                       .'echo '-------------------------------------------------------------------------'#因为要对配置文件进行修改,所以先备份一下以防搞坏配置cp /etc/rsyslog.conf /etc/rsyslog.conf.bak#下面是对于各选项以及对应的操作的菜单    echo -e "\n"    echo '                **   Options for log service settings **'    echo '.'    echo '.                      0.  Quit the script'    echo '.                      1.  Setting log information dump'    echo '.                      2.  Create a shell script to deal with specific log information'    echo '.                      3.  Record your log to normal file or device'    echo '.                      4.  Set user(s) to receive your log information'    echo '.                      5.  Discard some type or level log information'    echo '.                      6.  Set log collection format'    echo '.                      7.  Set time sync'    echo '.                      8.  Set timezone'    echo '.                      9.  Set utc time(0|1)'    echo '.                      10. Restart rsyslog service'    echo '.                      11. Stop firewalld service'    echo '.                      12. restart chronyd service'    echo '.'    echo '                *********************************************'#初始化一个条件参数让程序顺利进入循环读取操作optionNum=100until [ $optionNum = 0 ]#进入until流程控制,结束条件是菜单选项为 : 0    do    echo -e "\n"    read -p 'Please input your choice as number(0 to quit): ' optionNum    echo -e "\n"    case $optionNum in    #进入case流程控制,用来对用户的各种非脚本退出选择进行相应的操作        0)            break;;            #退出条件        1)            echo 'Please input your host type with setting items'            echo 'eg(for server):server udp'            echo 'eg(for client):client ip-udp'            read hosttype protocol            if [ $hosttype = 'client' ]            then                echo 'You choose to set your host as Client!!'                ip=`echo ${protocol%%-*}`                proto=`echo ${protocol:0-3}`                promark='@'                if [ $proto = 'udp' ]                    then                    echo 'You protocol type is udp!'                elif [ $proto = 'tcp' ]                    then                    promark='@@'                    echo 'You protocol type is tcp!'                else                    echo 'protocol type not match the option(udp or tcp)!'                    continue                #跳过接下来要执行的操作,返回用户菜单选择                fi                sed "/RULES/a *.*  ${promark}${ip}" -i /etc/rsyslog.conf            elif [ $hosttype = 'server' ]            then                echo 'You choose to set your host as Server!!'                if [ $protocol = 'udp' ]                    then                    sed -e 's/#$ModLoad imudp/$ModLoad imudp/; s/#$UDPServerRun/$UDPServerRun/' -i /etc/rsyslog.conf                elif [ $protocol = 'tcp' ]                    then                    sed -e 's/#$ModLoad imtcp/$ModLoad imtcp/; s/#$InputTCPServerRun/$InputTCPServerRun/' -i /etc/rsyslog.conf                else                    echo 'Wrong protocol type!'                    continue                fi            else                echo 'Host type not match the option(server or client)!'                continue            fi            echo '-----'            echo 'TIps: Please restart related service while your rightly configured!'            echo '-----';;        2)            read -p 'please input your log type with level(eg:local3.*) and script location with file name(eg:/var/log/logscript.sh): ' loglevel scriptLocation            sed "/local7/a ${loglevel}  ^${scriptLocation}" -i /etc/rsyslog.conf            touch $scriptLocation            chmod +x $scriptLocation            ;;        3)            echo 'eg:*.*     /var/log/file.log      # 普通文件,绝对路径'            echo 'eg:*.*     /dev/pts/0 #设备文件'            read -p  'Please input your log with level and file path: ' loglevel path            sed "/#kern.*/a ${loglevel}  ${path}" -i /etc/rsyslog.conf            ;;        4)            echo 'eg:*.*   root'            echo 'eg:*.*   root,kadefor,up01    # 使用,号分隔多个用户'            echo 'eg:*.*   *                # *号表示所有在线用户'            read -p  'Set user(s) to receive your log information: ' loglevel user            sed "/#kern.*/a ${loglevel}  ${user}" -i /etc/rsyslog.conf            ;;        5)            echo 'eg:local3.*    # 忽略所有local3类型的所有级别的日志'            read -p  'Discard some type or level log information: ' discard            sed "/#kern.*/a ${discard} ~" -i /etc/rsyslog.conf            ;;        6)            echo 'eg:WESTOS %timegenerated% %FROMHOST-IP% %syslogtag% %msg%'            read -p  'Set log collection name and format: ' name format1 format2 format3 format4            sed  "/RULES/a \$template ${name}, '${format1} ${format2} ${format3} ${format4}huanhang'" -i /etc/rsyslog.conf            sed 's/huanhang/\\n/g' -i /etc/rsyslog.conf            echo '*.info;mail.none;authpriv.none;cron.none                /var/log/messages;WESTOS'            read -p  'Set log type with level and apply: ' apply1 apply2            sed "/\$template/a ${apply1} ${apply2}" -i /etc/rsyslog.conf            ;;        7)              echo 'Please input your host type with setting items'            echo 'eg(for client):client 8.8.8.8'            echo 'eg(for server):server 172.25.0.0/16'            read hosttype hostip            if [ $hosttype = 'client' ]                then                sed "/www.pool.ntp.org/a server ${hostip} iburst" -i /etc/chrony.conf            elif [ $hosttype = 'server' ]                then                echo '-----'                echo 'Please confirm chrony service installed!'                echo '-----'                sed "/.rhel.pool.ntp.org/d; /Allow NTP/a allow  ${hostip}" -i /etc/chrony.conf                sed '/local stratum/a local stratum 10' -i >/etc/chrony.conf            else                echo 'Host type not match the option(server or client)!'                continue            fi            echo '-----'            echo 'TIps: Please restart related service while your rightly configured!'            echo '-----'            ;;        8)            read -p  'Plese input timezone to set(eg:Asia/Shanghai): ' timezone            timedatectl set-timezone $timezone                     ;;        9)            read -p  'Plese input utc flag(0/1): ' flag            timedatectl set-local-rtc $flag            ;;        10)            systemctl restart rsyslog            echo 'rsyslog restarted!'            ;;        11)            systemctl stop firewalld            systemctl disable firewalld            echo 'firewalld stopped!'            ;;        12)            systemctl restart chronyd            echo 'chronyd restarted!'            ;;        *)            echo 'Option not match any(0-12)!!!'            continue            #对于用户的非0非正确输入进行提醒并重新进入菜单选择            ;;    esac    done#用户选择退出选项,脚本退出echo 'The script exited!'

首先我们来看一下初始界面

这里写图片描述

然后来看一下此脚本对于用户输入的错误处理

这里写图片描述

下图为操作11和12的直观感受,可以看到命令执行之后有了相应的结果

chronyd服务重启firewalld服务关闭

这里写图片描述

下图为操作9和10的直观感受,可以看到命令执行之后有了相应的结果

rsyslogd服务重启RTC设置生效

这里写图片描述

下图为操作7直观感受,可以看到客户端的时间和服务端进行了同步

这里写图片描述

下图为操作6直观感受,日志同步格式写入了配置文件

这里写图片描述

下图为操作345直观感受,日志同步格式写入了配置文件

这里写图片描述

下图为操作1直观感受,作为服务器的主机配置写入成功,开启了udp接收端口

这里写图片描述

下图为操作8直观感受,前面的操作中时区都是美国,现在我们将时区改成了亚洲/上海(Asia/Shanghai)

这里写图片描述

原创粉丝点击