shell里的date 和mysql_shell脚本中

本文目录

11、iptables自动屏蔽访问网站频繁的IP

12、判断用户输入的是否为IP地址

13、判断用户输入的是否为数字

14、给定目录找出包含关键字的文件

15、监控目录,将新创建的文件名追加到日志中

16、给用户提供多个网卡选择

17、查看网卡实时流量

18、MySQL数据库备份

19、Nginx服务管理脚本

20、用户根据菜单选择要连接的Linux主机

11、iptables自动屏蔽访问网站频繁的IP

场景:恶意访问,安全防范

1)屏蔽每分钟访问超过200的IP

方法1:根据访问日志(Nginx为例)

!/bin/bash

DATE=

math?formula=(date%20%2B%25d%2F%25b%2F%25Y%3A%25H%3A%25M)%20ABNORMAL_IP%3D(tail -n5000 access.log |grep

math?formula=DATE%20%7Cawk%20'%7Ba%5B1]++}END{for(i in a)if(a[i]>100)print i}')

先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。

for IP in

math?formula=ABNORMAL_IP%3B%20do%20if%20%5B(iptables -vnL |grep -c "

math?formula=IP%22)%20-eq%200%20%5D%3B%20then%20iptables%20-I%20INPUT%20-sIP -j DROP

fi

done

方法2:通过TCP建立的连接

!/bin/bash

ABNORMAL_IP=

math?formula=(netstat%20-an%20%7Cawk%20'4~/:80

math?formula=%2F%20%26%266~/ESTABLISHED/{gsub(/:[0-9]+/,"",

math?formula=5)%3B%7Ba%5B5]++}}END{for(i in a)if(a[i]>100)print i}')

gsub是将第五列(客户端IP)的冒号和端口去掉

for IP in

math?formula=ABNORMAL_IP%3B%20do%20if%20%5B(iptables -vnL |grep -c "

math?formula=IP%22)%20-eq%200%20%5D%3B%20then%20iptables%20-I%20INPUT%20-sIP -j DROP

fi

done

2)屏蔽每分钟SSH尝试登录超过10次的IP

方法1:通过lastb获取登录状态:

!/bin/bash

DATE=

math?formula=(date%20%2B%22%25a%20%25b%20%25e%20%25H%3A%25M%22)%20%23%E6%98%9F%E6%9C%9F%E6%9C%88%E5%A4%A9%E6%97%B6%E5%88%86%20%25e%E5%8D%95%E6%95%B0%E5%AD%97%E6%97%B6%E6%98%BE%E7%A4%BA7%EF%BC%8C%E8%80%8C%25d%E6%98%BE%E7%A4%BA07%20ABNORMAL_IP%3D(lastb |grep "

math?formula=DATE%22%20%7Cawk%20'%7Ba%5B3]++}END{for(i in a)if(a[i]>10)print i}')

for IP in

math?formula=ABNORMAL_IP%3B%20do%20if%20%5B(iptables -vnL |grep -c "

math?formula=IP%22)%20-eq%200%20%5D%3B%20then%20iptables%20-I%20INPUT%20-sIP -j DROP

fi

done

方法2:通过日志获取登录状态

!/bin/bash

DATE=

math?formula=(date%20%2B%22%25b%20%25d%20%25H%22)%20ABNORMAL_IP%3D%22(tail -n10000 /var/log/auth.log |grep "

math?formula=DATE%22%20%7Cawk%20'%2FFailed%2F%7Ba%5B(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')"

for IP in

math?formula=ABNORMAL_IP%3B%20do%20if%20%5B(iptables -vnL |grep -c "

math?formula=IP%22)%20-eq%200%20%5D%3B%20then%20iptables%20-A%20INPUT%20-sIP -j DROP

echo "

math?formula=(date%20%2B%22%25F%20%25T%22)%20-%20iptables%20-A%20INPUT%20-sIP -j DROP" >>~/ssh-login-limit.log

fi

done

12、判断用户输入的是否为IP地址

方法1:

!/bin/bash

function check_ip(){

IP=

math?formula=1%20VALID_CHECK%3D(echo

math?formula=IP%7Cawk%20-F.%20'1< =255&&

math?formula=2%3C%3D255%26%263<=255&&

math?formula=4%3C%3D255%7Bprint%20%22yes%22%7D')%20if%20echoIP|grep -E "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

math?formula=%22%3E%2Fdev%2Fnull%3B%20then%20if%20%5BVALID_CHECK == "yes" ]; then

echo "

math?formula=IP%20available.%22%20else%20echo%20%22IP not available!"

fi

else

echo "Format error!"

fi

}

check_ip 192.168.1.1

check_ip 256.1.1.1

方法2:

!/bin/bash

function check_ip(){

IP=

math?formula=1%20if%20%5B%5BIP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

math?formula=%5D%5D%3B%20then%20FIELD1%3D(echo

math?formula=IP%7Ccut%20-d.%20-f1)%20FIELD2%3D(echo

math?formula=IP%7Ccut%20-d.%20-f2)%20FIELD3%3D(echo

math?formula=IP%7Ccut%20-d.%20-f3)%20FIELD4%3D(echo

math?formula=IP%7Ccut%20-d.%20-f4)%20if%20%5BFIELD1 -le 255 -a

math?formula=FIELD2%20-le%20255%20-aFIELD3 -le 255 -a

math?formula=FIELD4%20-le%20255%20%5D%3B%20then%20echo%20%22IP available."

else

echo "$IP not available!"

fi

else

echo "Format error!"

fi

}

check_ip 192.168.1.1

check_ip 256.1.1.1

增加版:

加个死循环,如果IP可用就退出,不可用提示继续输入,并使用awk判断。

!/bin/bash

function check_ip(){

local IP=

math?formula=1%20VALID_CHECK%3D(echo

math?formula=IP%7Cawk%20-F.%20'1< =255&&

math?formula=2%3C%3D255%26%263<=255&&

math?formula=4%3C%3D255%7Bprint%20%22yes%22%7D')%20if%20echoIP|grep -E "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

math?formula=%22%20%3E%2Fdev%2Fnull%3B%20then%20if%20%5BVALID_CHECK == "yes" ]; then

return 0

else

echo "

math?formula=IP%20not%20available!%22%20return%201%20fi%20else%20echo%20%22Format%20error!%20Please%20input%20again.%22%20return%201%20fi%20%7D%20while%20true%3B%20do%20read%20-p%20%22Please%20enter%20IP%3A%20%22%20IP%20check_ipIP

[ $? -eq 0 ] && break || continue

done

13、判断用户输入的是否为数字

方法1:

!/bin/bash

if [[

math?formula=1%20%3D~%20%5E%5B0-9%5D%2B ]]; then

echo "Is Number."

else

echo "No Number."

fi

方法2:

!/bin/bash

if [ $1 -gt 0 ] 2>/dev/null; then

echo "Is Number."

else

echo "No Number."

fi

方法3:

!/bin/bash

echo

math?formula=1%20%7Cawk%20'%7Bprint0~/^[0-9]+

math?formula=%2F%3F%22Is%20Number.%22%3A%22No%20Number.%22%7D'%20%23%E4%B8%89%E7%9B%AE%E8%BF%90%E7%AE%97%E7%AC%A6%2012.14%20%E6%89%BE%E5%87%BA%E5%8C%85%E5%90%AB%E5%85%B3%E9%94%AE%E5%AD%97%E7%9A%84%E6%96%87%E4%BB%B6%20DIR%3D1

KEY=

math?formula=2%20for%20FILE%20in(find

math?formula=DIR%20-type%20f)%3B%20do%20if%20grepKEY

math?formula=FILE%20%26%3E%2Fdev%2Fnull%3B%20then%20echo%20%22--%3EFILE"

fi

done

14、给定目录找出包含关键字的文件

#!/bin/bash

DIR=

math?formula=1%20KEY%3D2

for FILE in

math?formula=(findDIR -type f); do

if grep

math?formula=KEYFILE &>/dev/null; then

echo "--> $FILE"

fi

done

15、监控目录,将新创建的文件名追加到日志中

场景:记录目录下文件操作。

需先安装inotify-tools软件包。

!/bin/bash

MON_DIR=/opt

inotifywait -mq --format %f -e create

math?formula=MON_DIR%20%7C%5C%20while%20read%20files%3B%20do%20echofiles >> test.log

done

16、给用户提供多个网卡选择

场景:服务器多个网卡时,获取指定网卡,例如网卡流量

!/bin/bash

function local_nic() {

local NUM ARRAY_LENGTH

NUM=0

for NIC_NAME in

math?formula=(ls%20%2Fsys%2Fclass%2Fnet%7Cgrep%20-vE%20%22lo%7Cdocker0%22)%3B%20do%20NIC_IP%3D(ifconfig

math?formula=NIC_NAME%20%7Cawk%20-F'%5B%3A%20%5D%2B'%20'%2Finet%20addr%2F%7Bprint4}')

if [ -n "

math?formula=NIC_IP%22%20%5D%3B%20then%20NIC_IP_ARRAY%5BNUM]="

math?formula=NIC_NAME%3ANIC_IP" #将网卡名和对应IP放到数组

let NUM++

fi

done

ARRAY_LENGTH=

math?formula=%7B%23NIC_IP_ARRAY%5B*%5D%7D%20if%20%5BARRAY_LENGTH -eq 1 ]; then #如果数组里面只有一条记录说明就一个网卡

NIC=

math?formula=%7BNIC_IP_ARRAY%5B0%5D%25%3A*%7D%20return%200%20elif%20%5BARRAY_LENGTH -eq 0 ]; then #如果没有记录说明没有网卡

echo "No available network card!"

exit 1

else

#如果有多条记录则提醒输入选择

for NIC in

math?formula=%7BNIC_IP_ARRAY%5B*%5D%7D%3B%20do%20echoNIC

done

while true; do

read -p "Please enter local use to network card name: " INPUT_NIC_NAME

COUNT=0

for NIC in

math?formula=%7BNIC_IP_ARRAY%5B*%5D%7D%3B%20do%20NIC_NAME%3D{NIC%:}

if [

math?formula=NIC_NAME%20%3D%3D%20%22INPUT_NIC_NAME" ]; then

NIC=

math?formula=%7BNIC_IP_ARRAY%5BCOUNT]%:}

return 0

else

COUNT+=1

fi

done

echo "Not match! Please input again."

done

fi

}

local_nic

17、查看网卡实时流量

适用于CentOS6操作系统。

!/bin/bash

Description: Only CentOS6

traffic_unit_conv() {

local traffic=

math?formula=1%20if%20%5Btraffic -gt 1024000 ]; then

printf "%.1f%s" "

math?formula=((traffic/1024/1024))" "MB/s"

elif [

math?formula=traffic%20-lt%201024000%20%5D%3B%20then%20printf%20%22%25.1f%25s%22%20%22((

math?formula=traffic%2F1024))%22%20%22KB%2Fs%22%20fi%20%7D%20NIC%3D1

echo -e " In ------ Out"

while true; do

OLD_IN=

math?formula=(awk%20-F'%5B%3A%20%5D%2B'%20'0~"'

math?formula=NIC'%22%7Bprint3}' /proc/net/dev)

OLD_OUT=

math?formula=(awk%20-F'%5B%3A%20%5D%2B'%20'0~"'

math?formula=NIC'%22%7Bprint11}' /proc/net/dev)

sleep 1

NEW_IN=

math?formula=(awk%20-F'%5B%3A%20%5D%2B'%20'0~"'

math?formula=NIC'%22%7Bprint3}' /proc/net/dev)

NEW_OUT=

math?formula=(awk%20-F'%5B%3A%20%5D%2B'%20'0~"'

math?formula=NIC'%22%7Bprint11}' /proc/net/dev)

IN=

math?formula=((NEW_IN-

math?formula=OLD_IN))%20OUT%3D((

math?formula=NEW_OUT-OLD_OUT))

echo "

math?formula=(traffic_unit_convIN)

math?formula=(traffic_unit_convOUT)"

sleep 1

done

使用:./traffic.sh eth0

18、MySQL数据库备份

#!/bin/bash

DATE=

math?formula=(date%20%2B%25F_%25H-%25M-%25S)%20HOST%3D192.168.1.120%20DB%3Dtest%20USER%3Dbak%20PASS%3D123456%20MAIL%3D%22zhangsan%40example.com%20lisi%40example.com%22%20BACKUP_DIR%3D%2Fdata%2Fdb_backup%20SQL_FILE%3D{DB}full

math?formula=DATE.sql%20BAK_FILE%3D{DB}full

math?formula=DATE.zip%20cdBACKUP_DIR

if mysqldump -h

math?formula=HOST%20-uUSER -p

math?formula=PASS%20--single-transaction%20--routines%20--triggers%20-BDB >

math?formula=SQL_FILE%3B%20then%20zipBAK_FILE

math?formula=SQL_FILE%20%26%26%20rm%20-fSQL_FILE

if [ ! -s

math?formula=BAK_FILE%20%5D%3B%20then%20echo%20%22DATE 内容" | mail -s "主题"

math?formula=MAIL%20fi%20else%20echo%20%22DATE 内容" | mail -s "主题"

math?formula=MAIL%20fi%20findBACKUP_DIR -name '*.zip' -ctime +14 -exec rm {} ;

19、Nginx服务管理脚本

场景:使用源码包安装Nginx不含带服务管理脚本,也就是不能使用"service nginx start"或"/etc/init.d/nginx start",所以写了以下的服务管理脚本。

!/bin/bash

Description: Only support RedHat system

. /etc/init.d/functions

WORD_DIR=/usr/local/nginx

DAEMON=

math?formula=WORD_DIR%2Fsbin%2Fnginx%20CONF%3DWORD_DIR/conf/nginx.conf

NAME=nginx

PID=

math?formula=(awk%20-F'%5B%3B%20%5D%2B'%20'%2F%5E%5B%5E%23%5D%2F%7Bif(0~/pid;/)print

math?formula=2%7D'CONF)

if [ -z "

math?formula=PID%22%20%5D%3B%20then%20PID%3DWORD_DIR/logs/nginx.pid

else

PID=

math?formula=WORD_DIR%2FPID

fi

stop() {

math?formula=DAEMON%20-s%20stop%20sleep%201%20%5B%20!%20-fPID ] && action "* Stopping

math?formula=NAME%22%20%2Fbin%2Ftrue%20%7C%7C%20action%20%22*%20StoppingNAME" /bin/false

}

start() {

math?formula=DAEMON%20sleep%201%20%5B%20-fPID ] && action "* Starting

math?formula=NAME%22%20%2Fbin%2Ftrue%20%7C%7C%20action%20%22*%20StartingNAME" /bin/false

}

reload() {

math?formula=DAEMON%20-s%20reload%20%7D%20test_config()%20%7BDAEMON -t

}

case "

math?formula=1%22%20in%20start)%20if%20%5B%20!%20-fPID ]; then

start

else

echo "

math?formula=NAME%20is%20running...%22%20exit%200%20fi%20%3B%3B%20stop)%20if%20%5B%20-fPID ]; then

stop

else

echo "

math?formula=NAME%20not%20running!%22%20exit%200%20fi%20%3B%3B%20restart)%20if%20%5B%20!%20-fPID ]; then

echo "

math?formula=NAME%20not%20running!%22%20start%20else%20stop%20start%20fi%20%3B%3B%20reload)%20reload%20%3B%3B%20testconfig)%20test_config%20%3B%3B%20status)%20%5B%20-fPID ] && echo "

math?formula=NAME%20is%20running...%22%20%7C%7C%20echo%20%22NAME not running!"

;;

*)

echo "Usage: $0 {start|stop|restart|reload|testconfig|status}"

exit 3

;;

esac

20、用户根据菜单选择要连接的Linux主机

Linux主机SSH连接信息:

cat host.txt

Web 192.168.1.10 root 22

DB 192.168.1.11 root 22

内容格式:主机名 IP User Port

!/bin/bash

PS3="Please input number: "

HOST_FILE=host.txt

while true; do

select NAME in

math?formula=(awk%20'%7Bprint1}'

math?formula=HOST_FILE)%20quit%3B%20do%20%5B{NAME:=empty} == "quit" ] && exit 0

IP=

math?formula=(awk%20-v%20NAME%3D{NAME} '

math?formula=1%3D%3DNAME%7Bprint2}'

math?formula=HOST_FILE)%20USER%3D(awk -v NAME=

math?formula=%7BNAME%7D%20'1==NAME{print

math?formula=3%7D'HOST_FILE)

PORT=

math?formula=(awk%20-v%20NAME%3D{NAME} '

math?formula=1%3D%3DNAME%7Bprint4}'

math?formula=HOST_FILE)%20if%20%5BIP ]; then

echo "Name:

math?formula=NAME%2C%20IP%3AIP"

ssh -o StrictHostKeyChecking=no -p

math?formula=PORT%20-i%20id_rsaUSER@$IP # 密钥免交互登录

break

else

echo "Input error, Please enter again!"

break

fi

done

done

动手练一练,让你的Shell功底上升一个段位!

[好文要顶](javascript:void(0);) [关注我](javascript:void(0);) [收藏该文](javascript:void(0);) [

448dd8fb10ed

image

](javascript:void(0); "分享至新浪微博")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值