生产环境中常用的shell脚本有哪些
本篇内容主要讲解“生产环境中常用的shell脚本有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“生产环境中常用的shell脚本有哪些”吧!
场景:恶意访问,安全防范1)屏蔽每分钟访问超过200的IP方法1:根据访问日志(Nginx为例)#!/bin/bashDATE=$(date+%d/%b/%Y:%H:%M)ABNORMAL_IP=$(tail-n5000access.log|grep$DATE|awk'{a[$1]++}END{for(iina)if(a[i]>100)printi}')#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-IINPUT-s$IP-jDROPfidone方法2:通过TCP建立的连接#!/bin/bashABNORMAL_IP=$(netstat-an|awk'$4~/:80$/&&$6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(iina)if(a[i]>100)printi}')#gsub是将第五列(客户端IP)的冒号和端口去掉forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-IINPUT-s$IP-jDROPfidone2)屏蔽每分钟SSH尝试登录超过10次的IP方法1:通过lastb获取登录状态:#!/bin/bashDATE=$(date+"%a%b%e%H:%M")#星期月天时分%e单数字时显示7,而%d显示07ABNORMAL_IP=$(lastb|grep"$DATE"|awk'{a[$3]++}END{for(iina)if(a[i]>10)printi}')forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-IINPUT-s$IP-jDROPfidone方法2:通过日志获取登录状态#!/bin/bashDATE=$(date+"%b%d%H")ABNORMAL_IP="$(tail-n10000/var/log/auth.log|grep"$DATE"|awk'/Failed/{a[$(NF-3)]++}END{for(iina)if(a[i]>5)printi}')"forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-AINPUT-s$IP-jDROPecho"$(date+"%F%T")-iptables-AINPUT-s$IP-jDROP">>~/ssh-login-limit.logfidone2、判断用户输入的是否为IP地址
方法1:#!/bin/bashfunctioncheck_ip(){IP=$1VALID_CHECK=$(echo$IP|awk-F.'$1)ifecho$IP|grep-E"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null;thenif[$VALID_CHECK=="yes"];thenecho"$IPavailable."elseecho"$IPnotavailable!"fielseecho"Formaterror!"fi}check_ip192.168.1.1check_ip256.1.1.1方法2:#!/bin/bashfunctioncheck_ip(){IP=$1if[[$IP=~^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$]];thenFIELD1=$(echo$IP|cut-d.-f1)FIELD2=$(echo$IP|cut-d.-f2)FIELD3=$(echo$IP|cut-d.-f3)FIELD4=$(echo$IP|cut-d.-f4)if[$FIELD1-le255-a$FIELD2-le255-a$FIELD3-le255-a$FIELD4-le255];thenecho"$IPavailable."elseecho"$IPnotavailable!"fielseecho"Formaterror!"fi}check_ip192.168.1.1check_ip256.1.1.1增加版:加个死循环,如果IP可用就退出,不可用提示继续输入,并使用awk判断。#!/bin/bashfunctioncheck_ip(){localIP=$1VALID_CHECK=$(echo$IP|awk-F.'$1)ifecho$IP|grep-E"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null;thenif[$VALID_CHECK=="yes"];thenreturn0elseecho"$IPnotavailable!"return1fielseecho"Formaterror!Pleaseinputagain."return1fi}whiletrue;doread-p"PleaseenterIP:"IPcheck_ip$IP[$?-eq0]&&break||continuedone3、判断用户输入的是否为数字
方法1:#!/bin/bashif[[$1=~^[0-9]+$]];thenecho"IsNumber."elseecho"NoNumber."fi方法2:#!/bin/bashif[$1-gt0]2>/dev/null;thenecho"IsNumber."elseecho"NoNumber."fi方法3:#!/bin/bashecho$1|awk'{print$0~/^[0-9]+$/?"IsNumber.":"NoNumber."}'#三目运算符12.14找出包含关键字的文件DIR=$1KEY=$2forFILEin$(find$DIR-typef);doifgrep$KEY$FILE&>/dev/null;thenecho"-->$FILE"fidone4、给定目录找出包含关键字的文件
#!/bin/bashDIR=$1KEY=$2forFILEin$(find$DIR-typef);doifgrep$KEY$FILE&>/dev/null;thenecho"-->$FILE"fidone5、监控目录,将新创建的文件名追加到日志中
场景:记录目录下文件操作。需先安装inotify-tools软件包。#!/bin/bashMON_DIR=/optinotifywait-mq--format%f-ecreate$MON_DIR|\whilereadfiles;doecho$files>>test.logdone6、给用户提供多个网卡选择
场景:服务器多个网卡时,获取指定网卡,例如网卡流量#!/bin/bashfunctionlocal_nic(){localNUMARRAY_LENGTHNUM=0forNIC_NAMEin$(ls/sys/class/net|grep-vE"lo|docker0");doNIC_IP=$(ifconfig$NIC_NAME|awk-F'[:]+''/inetaddr/{print$4}')if[-n"$NIC_IP"];thenNIC_IP_ARRAY[$NUM]="$NIC_NAME:$NIC_IP"#将网卡名和对应IP放到数组letNUM++fidoneARRAY_LENGTH=${#NIC_IP_ARRAY[*]}if[$ARRAY_LENGTH-eq1];then#如果数组里面只有一条记录说明就一个网卡NIC=${NIC_IP_ARRAY[0]%:*}return0elif[$ARRAY_LENGTH-eq0];then#如果没有记录说明没有网卡echo"Noavailablenetworkcard!"exit1else#如果有多条记录则提醒输入选择forNICin${NIC_IP_ARRAY[*]};doecho$NICdonewhiletrue;doread-p"Pleaseenterlocalusetonetworkcardname:"INPUT_NIC_NAMECOUNT=0forNICin${NIC_IP_ARRAY[*]};doNIC_NAME=${NIC%:*}if[$NIC_NAME=="$INPUT_NIC_NAME"];thenNIC=${NIC_IP_ARRAY[$COUNT]%:*}return0elseCOUNT+=1fidoneecho"Notmatch!Pleaseinputagain."donefi}local_nic7、查看网卡实时流量
适用于CentOS6操作系统。#!/bin/bash#Description:OnlyCentOS6traffic_unit_conv(){localtraffic=$1if[$traffic-gt1024000];thenprintf"%.1f%s""$(($traffic/1024/1024))""MB/s"elif[$traffic-lt1024000];thenprintf"%.1f%s""$(($traffic/1024))""KB/s"fi}NIC=$1echo-e"In------Out"whiletrue;doOLD_IN=$(awk-F'[:]+''$0~"'$NIC'"{print$3}'/proc/net/dev)OLD_OUT=$(awk-F'[:]+''$0~"'$NIC'"{print$11}'/proc/net/dev)sleep1NEW_IN=$(awk-F'[:]+''$0~"'$NIC'"{print$3}'/proc/net/dev)NEW_OUT=$(awk-F'[:]+''$0~"'$NIC'"{print$11}'/proc/net/dev)IN=$(($NEW_IN-$OLD_IN))OUT=$(($NEW_OUT-$OLD_OUT))echo"$(traffic_unit_conv$IN)$(traffic_unit_conv$OUT)"sleep1done使用:./traffic.sheth08、MySQL数据库备份
#!/bin/bashDATE=$(date+%F_%H-%M-%S)HOST=192.168.1.120DB=testUSER=bakPASS=123456MAIL="zhangsan@example.comlisi@example.com"BACKUP_DIR=/data/db_backupSQL_FILE=${DB}_full_$DATE.sqlBAK_FILE=${DB}_full_$DATE.zipcd$BACKUP_DIRifmysqldump-h$HOST-u$USER-p$PASS--single-transaction--routines--triggers-B$DB>$SQL_FILE;thenzip$BAK_FILE$SQL_FILE&&rm-f$SQL_FILEif[!-s$BAK_FILE];thenecho"$DATE内容"|mail-s"主题"$MAILfielseecho"$DATE内容"|mail-s"主题"$MAILfifind$BACKUP_DIR-name'*.zip'-ctime+14-execrm{}\;9、Nginx服务管理脚本
场景:使用源码包安装Nginx不含带服务管理脚本,也就是不能使用"servicenginxstart"或"/etc/init.d/nginxstart",所以写了以下的服务管理脚本。#!/bin/bash#Description:OnlysupportRedHatsystem./etc/init.d/functionsWORD_DIR=/usr/local/nginxDAEMON=$WORD_DIR/sbin/nginxCONF=$WORD_DIR/conf/nginx.confNAME=nginxPID=$(awk-F'[;]+''/^[^#]/{if($0~/pid;/)print$2}'$CONF)if[-z"$PID"];thenPID=$WORD_DIR/logs/nginx.pidelsePID=$WORD_DIR/$PIDfistop(){$DAEMON-sstopsleep1[!-f$PID]&&action"*Stopping$NAME"/bin/true||action"*Stopping$NAME"/bin/false}start(){$DAEMONsleep1[-f$PID]&&action"*Starting$NAME"/bin/true||action"*Starting$NAME"/bin/false}reload(){$DAEMON-sreload}test_config(){$DAEMON-t}case"$1"instart)if[!-f$PID];thenstartelseecho"$NAMEisrunning..."exit0fi;;stop)if[-f$PID];thenstopelseecho"$NAMEnotrunning!"exit0fi;;restart)if[!-f$PID];thenecho"$NAMEnotrunning!"startelsestopstartfi;;reload)reload;;testconfig)test_config;;status)[-f$PID]&&echo"$NAMEisrunning..."||echo"$NAMEnotrunning!";;*)echo"Usage:$0{start|stop|restart|reload|testconfig|status}"exit3;;esac10、用户根据菜单选择要连接的Linux主机
Linux主机SSH连接信息:#cathost.txtWeb192.168.1.10root22DB192.168.1.11root22内容格式:主机名IPUserPort#!/bin/bashPS3="Pleaseinputnumber:"HOST_FILE=host.txtwhiletrue;doselectNAMEin$(awk'{print$1}'$HOST_FILE)quit;do[${NAME:=empty}=="quit"]&&exit0IP=$(awk-vNAME=${NAME}'$1==NAME{print$2}'$HOST_FILE)USER=$(awk-vNAME=${NAME}'$1==NAME{print$3}'$HOST_FILE)PORT=$(awk-vNAME=${NAME}'$1==NAME{print$4}'$HOST_FILE)if[$IP];thenecho"Name:$NAME,IP:$IP"ssh-oStrictHostKeyChecking=no-p$PORT-iid_rsa$USER@$IP#密钥免交互登录breakelseecho"Inputerror,Pleaseenteragain!"breakfidonedone
到此,相信大家对“生产环境中常用的shell脚本有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。