Shell脚本(一)

1、批量生成随机字符文件名

#!/bin/bash 
path=/test                         #定义生产文件的路径
[ -d "$path" ] || mkdir -p $path   #如果定义的路径不存在则创建
for n in `seq 10`                  # for循环10次,即创建10个文件
do    random=$(openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11) #将10位随机字符赋值给变量
    touch $path/${random}_zh.html  #根据题意生成所需要的文件
done

执行结果

[root@zh shell]# bash 1.sh 
[root@zh shell]# ll /test/
总用量 0
-rw-r--r--. 1 root root 0 7月   4 09:00 dfbzjsmiax_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 eitkaqiaru_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 ffnmovvpba_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 hktzxkinqx_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 pfvtvsvdfu_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 plhekmfnjw_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 tkkmqhqbbj_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 tqyfnhtzaq_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 wgflisfmzc_zh.html
-rw-r--r--. 1 root root 0 7月   4 09:00 zjntczutlt_zh.html

2、批量改名  html 改 HTML

方法一
#!/bin/bash 
filename=_zh.HTML    #定义替换后的目标字符串
dirname="/test"      #定义操作目录
cd $dirname || exit 1    #切换到指定目录下,如果不成功则退出
for n in `ls`        #遍历当前目录获取文件名列表,并循环处理
do
  name=$(echo ${n} | awk -F '_' '{print $1}')  #定义替换后的目标
  mv $n ${name}${filename}   #实际 mv 改名操作命令
done

执行结果

[root@zh shell]# bash 2.sh 
[root@zh shell]# ll /test/
总用量 0
-rw-r--r--. 1 root root 0 7月   4 09:00 dfbzjsmiax_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 eitkaqiaru_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 ffnmovvpba_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 hktzxkinqx_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 pfvtvsvdfu_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 plhekmfnjw_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 tkkmqhqbbj_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 tqyfnhtzaq_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 wgflisfmzc_zh.HTML
-rw-r--r--. 1 root root 0 7月   4 09:00 zjntczutlt_zh.HTML

方法二
#!/bin/bash 
path="/test"
cd $path && \
ls | awk -F '_' '{print "mv "$0" "$1"_zh.HTML"}' | bash

方法三
[root@zh shell]# rename zh.html zh.HTML /test/*.html

3、批量创建特殊要求用户

  • 批量创建10个系统账号 zh01-zh10 并设置密码 (密码为随机数,要求是字符和数字等混合).
方法一
#!/bin/bash 
user="zh"
passfile="/test/user.log"
for num in `seq -w 10`
do 
	useradd $user$num   #创建用户
	pass="`echo "test$RANDOM" | md5sum | cut -c3-11`" #若多次用到随机数,就要将其定义成变量
	echo "pass" | passwd --stdin $user$num   #设置密码
	echo -e "user:$user$num\tpasswd:$pass">>$passfile  #记录设置的账号和密码信息
done
echo   ----OK----
cat $passfile

执行结果

[root@zh shell]# bash 3.sh 
更改用户 zh01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh02 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh03 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh04 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh05 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh06 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh07 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh08 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh09 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zh10 的密码 。
passwd:所有的身份验证令牌已经成功更新。
----OK----
user:zh01	passwd:766c0ed8d
user:zh02	passwd:474bdde47
user:zh03	passwd:764cd1a8a
user:zh04	passwd:457186f1b
user:zh05	passwd:41c361013
user:zh06	passwd:ed13938e2
user:zh07	passwd:5fa8df76e
user:zh08	passwd:5cb3038bb
user:zh09	passwd:bff572da9
user:zh10	passwd:b4730cb7d
-----------------------------------------------------------------------------
方法二
#!/bin/bash 
. /etc/init.d/functions
user="zh"
passfile="/test/user.log"
for num in `seq -w 11 15`
do
        pass="`echo "test$RANDOM"|md5sum | cut -c3-11`"
        useradd $user$num &>/dev/null &&\
        echo "$pass"| passwd --stdin $user$num &> /dev/null &&\
        echo -e "user:$user$num\tpasswd:$pass">>$passfile
        if [ $? -eq 0 ]  #根据返回值判断用户和密码是否添加成功
        then
                action "$user$num is OK" /bin/true
        else    action "$user$num is fail" /bin/false
        fi
done
echo ------------
cat $passfile && > $passfile

执行结果
[root@zh shell]# vim 3_1.sh
[root@zh shell]# bash 3_1.sh 
zh11 is OK                                                 [  确定  ]
zh12 is OK                                                 [  确定  ]
zh13 is OK                                                 [  确定  ]
zh14 is OK                                                 [  确定  ]
zh15 is OK                                                 [  确定  ]
------------
user:zh01	passwd:766c0ed8d
user:zh02	passwd:474bdde47
user:zh03	passwd:764cd1a8a
user:zh04	passwd:457186f1b
user:zh05	passwd:41c361013
user:zh06	passwd:ed13938e2
user:zh07	passwd:5fa8df76e
user:zh08	passwd:5cb3038bb
user:zh09	passwd:bff572da9
user:zh10	passwd:b4730cb7d
user:zh11	passwd:c356150e7
user:zh12	passwd:1838805f7
user:zh13	passwd:12d430211
user:zh14	passwd:a8c7cb7b7
user:zh15	passwd:142366a1c
-----------------------------------------------------------------------------
方法三
#!/bin/bash
. /etc/init.d/functions
user='test'
passfile="/test/user.logs"
for num in `seq -w 10`
do
        pass="`echo "test$RANDOM"|md5sum| cut -c3-11`"
        useradd $user$num &>/dev/null &&\
        echo -e "$user${num}:$pass">>$passfile  #生成密码到文件,但是并没有设置密码 
        if [ $? -eq 0 ]
        then
                action "$user$num is OK" /bin/true
        else
                action "$user$num is fail" /bin/false
        fi
done
echo -----------------
chpasswd < $passfile  #这里是关键,作用是读取密码文件进行密码设置
cat $passfile && > $passfile

执行结果
[root@zh shell]# bash 3_2.sh 
test01 is OK                                               [  确定  ]
test02 is OK                                               [  确定  ]
test03 is OK                                               [  确定  ]
test04 is OK                                               [  确定  ]
test05 is OK                                               [  确定  ]
test06 is OK                                               [  确定  ]
test07 is OK                                               [  确定  ]
test08 is OK                                               [  确定  ]
test09 is OK                                               [  确定  ]
test10 is OK                                               [  确定  ]
-----------------
test01:2e62fad64
test02:b40cd46de
test03:ccd214665
test04:a9be56dd2
test05:b33d55eea
test06:52504e57e
test07:f652ef845
test08:17c2e9d06
test09:0ba9ed13b
test10:502fa71ae
-----------------------------------------------------------------------------

4、扫描网络内 存活主机

  • 判断 192.168.1.0/24 网络里,当前在线的IP有哪些.
方法一
 #!/bin/bash 
  2 ping="ping -w 2 -c"     #定义ping命令参数
  3 ip="192.168.1."         #IP前半部分
  4 for n in $(seq 254)     #IP后半部分,1-254
  5 do
  6         {
  7         $ping $ip$n &>/dev/null     #对指定IP实行ping
  8         if [ $? -eq 0 ];then        #如果返回值为0,则证明该IP对应的主机存在
  9                 echo "$ip$n is OK"  #打印显示
 10 fi      
 11 }&              #Shell 的并发检测功能,批量 ping ,快速返回结果
 12 done

方法二
#!/bin/bash 
cmd="nmap -sP"
ip="192.168.1.0/24"
cmd2="nmap -sS"
$cmd $ip | awk '/nmap scan report for/ {print $NF}'

5、解决 DOS攻击

  • 根据 Web 日志或网络连接数,监控当某个IP并发连接数或短时间内 PV达到100,将其IP进行封掉.
方法一
#!/bin/bash 
file=$1      #定义一个变量接收命令行传参,参数为日志文件类型
while true 
do
        awk '{print $1}' $1|grep -v "^$"|sort|uniq -c > /test/tmp.log
        #分析传入的日志文件,并在排序去重后追加到一个临时文件里
        exec < /test/tmp.log   #读取上述临时文件
        while read line        #进入 while 循环处理
        do
                ip=`echo $line | awk '{print $2}'`   #获取文件中的每一行的第二列
                count=`echo $line|awk '{print $1}'`  #获取文件中的每一行的第一列
                if [ $count -gt 500 ] && [ `iptable -L -n | grep "$ip"|wc -l` -lt 1 ]
                #如果 PV 数大于500.并且防火墙里没有封此IP 
                then
                        iptables -I INPUT -s $ip -j DROP   #则封掉PV数大于500的IP
                        echo "$line is dropped" >> /test/droplist_$(date +%F).log
                                                        #记录处理日志
                        fi
        done
sleep 3600   #可以按照分钟进行分析,不过日志的分割或过滤也得按分钟才行
done

方法二
#!/bin/bash 
if expr "$file" : ".*\.log"  &>/dev/null   #expr 用法,判断扩展名是否以 .log 结尾
        then
        :          #这个冒好表示什么都不做 
        else
                echo $"usage:$0 xxx.log"    #对不符合扩展名类型的给出正确提示
        exit 1      #退出脚本 
fi

while true 
do
grep "ESTABLISHED" $1 | awk -F "[ :]+" '{ ++S[$(NF-3)]} END {for(key in S )print S[key],key}'| sort
-rn -k1 | head -5 > /test/tmp.log   # 分析传入的网络状态日志,获取到客户端IP列的信息,并重新排序

        while  read line     # 读取去重后的 /tmp/tmp.log 文件
        do
                ip=`echo $line|awk '{print $2}'`#获取文件中的每一行的第二列
                count=`echo $line| awk '{print $1}'` #获取文件中的每一行的第一列
if [ $count -gt 500 ] && [ `iptables -L -n`| grep "ip"|wc -l -lt 1 ]
#如果Pv数大于500,并且防火墙没有封此IP,可通过设置小的值测试
        then
                iptables -I INPUT -s $ip -j DROP   #则封掉pv数大于500的IP
                echo "$line is dropped" >> /test/droplist_$(date +%F).log
                # 记录处理日志
        fi
done</test/tmp.log  #读入临时日志文件,即使放在结尾,也是在进入循环的时候就读入了.


方法三
#!/bin/bash 
file=$1
JudgeExt(){             #定义扩展名的函数,可以传入日志文件
        if expr "$1" : ".*\.log" &>/dev/null
                then
                :
        else
                echo $"usage:$0 xxx.log"
                exit 1
        fi
}
IpCount(){              #分析日志,对访问的IP去重排序
grep "ESTABLISHED" $1|awk -F "[ :]+" '{ ++S[$(NF-3)]}END {for (key in S)print S[key],key}'|sort -rn
 -k1 | head -5 > /test/tmp.log
}
ipt(){        #防火墙封堵函数
        local ip=$1
        if [ `iptables -L -n| grep "$ip"|wc -l`-lt 1 ]
        then
        iptables -I INPUT -s $ip -j DROP
        echo "$line is dropped" >> /test/droplist_$(date +%F).log
        fi
}
main(){                 #主函数 main
        JudgeExt $line   #传入日志判断扩展名
        while true
        do
                IpCount $file      #对传入日志文件排序去重
                while read line 
        do
                ip=`echo $line| awk '{print $2}'`
                count=`echo $line|awk '{print $1}'`
                if [ $count -gt 3 ] #去重后检测,若某IP超过3次,则封堵.
        then
                ipt $ip    #封掉对应的IP
        fi
        done</test/tmp.log
        sleep 180
done        
}
mail

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值