【Linux中高级运维: 第55天——Shell编程】第6章:解决类DDOS攻击+批量改名+批量生成随机字符文件名

面试题1:已知test.txt文件里含有如下域名:

www.etiantian.org
bbs.etiantian.org
www.etiantian.org
blog.etiantian.org
www.etiantian.org
www.etiantian.org
blog.etiantian.org

统计每个域名出现的次数,并且按照从多到少排序。

uniq 去重 -c计数
sort -r倒序 -n数字排序
[root@web01 /server/scripts]# sort test.txt|uniq -c|sort -rn
      4 www.etiantian.org
      2 blog.etiantian.org
      1 bbs.etiantian.org
	  
[root@web01 /server/scripts]# awk '{++S[$1]} END {for(key in S) print S[key],key}' test.txt|sort -rn
4 www.etiantian.org
2 blog.etiantian.org
1 bbs.etiantian.org

第一篇:详解linux netstat输出的网络连接状态信息
http://oldboy.blog.51cto.com/2561410/1184139
第二篇:庖丁解牛获取连接状态数的awk数组命令
http://oldboy.blog.51cto.com/blog/2561410/1184165
第三篇:awk数组命令经典生产实战应用拓展
http://oldboy.blog.51cto.com/blog/2561410/1184177
第四篇:老男孩培训第八节课前awk考试题案例(门户面试题解答)
http://oldboy.blog.51cto.com/2561410/1184206
第五篇:linux生产服务器有关网络状态的优化措施(告一段落)
http://oldboy.blog.51cto.com/2561410/1184228

范例10_10:写一个Shell脚本解决类DDOS攻击的生产案例

请根据web日志或者系统网络连接数,监控当某个IP并发连接数,若短时内PV达到100,即调用防火墙命令封掉对应的IP。

防火墙命令为:iptables -I INPUT -s IP地址 -j DROP。
[root@web01 /server/scripts]# cat ctrl_ddos1.sh 
#!/bin/bash
##############################################################
# File Name: ctrl_ddos.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
jisuan(){
    awk -F "[ :]+" '/ESTABLISHED/{print $(NF-3)}' netstat.log|sort|uniq -c|sort -rn|head -10 >/tmp/ip.log
    while read line
    do
        ip=`echo $line|awk '{print $2}'`
        count=`echo $line|awk '{print $1}'`
        if [ $count -gt 10 ] && [ `iptables -nL|grep "$ip"|wc -l` -lt 1  ]
        then
            echo "$ip is 危险的"
            iptables -I INPUT -s $ip -j DROP
        else
            echo "$ip is 安全的"
        fi
    done</tmp/ip.log
}
main(){
   while true
   do
       jisuan
       sleep 5
   done
}
main
	  
	  
for 变量名 in 变量取值列表
do
    指令...
done


for n in 1 2 3 4 5
do
    echo $n
done
for n in {1..5} 
do
    echo $n
done
for n in `seq 5`
do
    echo $n
done

第二种for循环语句称之为C语言型for循环语句,其语法结构如下:

for((exp1;exp2;exp3))
do
    指令...
done


for ((i=1;i<=5;i++))
do
    echo $i
done

echo ====================
i=1
while ((i<=5))
do
    echo $i
    ((i++))
done 

随机数:

1、openssl随机数

[root@web01 /server/scripts]# openssl rand -base64 8|cut -c 1-8
M7R3cvSl
[root@web01 /server/scripts]# openssl rand -base64 8|cut -c 1-8
lqknKo1o

2、简单random随机数

[root@web01 /server/scripts]# echo $RANDOM
28127

RANDOM Each  time  this parameter is referenced, a random integer between 0 and 32767 is generated.  The
sequence of random numbers may be initialized by assigning a  value  to  RANDOM.   If  RANDOM  is
unset, it loses its special properties, even if it is subsequently reset.

3、时间随机数

[root@web01 /server/scripts]# date +%N
783556744
[root@web01 /server/scripts]# date +%N|md5sum|cut -c 5-13
c2ceaa04c

4、

[root@web01 /server/scripts]# head /dev/urandom|cksum|md5sum
f448a3b537ca1d8883079efc12705282  -
[root@web01 /server/scripts]# head /dev/urandom|cksum|md5sum
ef8bfd1604c04d0665c80741e5a6154d  -

5、

[root@web01 /server/scripts]# cat /proc/sys/kernel/random/uuid
4c2c10a8-e340-48e8-a61e-65b052fe1ea8
[root@web01 /server/scripts]# cat /proc/sys/kernel/random/uuid
23fccdff-cae2-472b-8d26-65403ff8efe4

6、

mkpasswd命令依赖于数据包expect,因此必须通过yum install expect -y命令先安装该数据包。

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:

[root@oldboy scripts]# ls /oldboy
apquvdpqbk_oldboy.html  mpyogpsmwj_oldboy.html  txynzwofgg_oldboy.html
bmqiwhfpgv_oldboy.html  mtrzobsprf_oldboy.html  vjxmlflawa_oldboy.html
jhjdcjnjxc_oldboy.html  qeztkkmewn_oldboy.html
jpvirsnjld_oldboy.html  ruscyxwxai_oldboy.html


touch apquvdpqbk_oldboy.html
touch bmqiwhfpgv_oldboy.html
touch jhjdcjnjxc_oldboy.html
touch jpvirsnjld_oldboy.html

1、10位小写字母随机数:

[root@web01 /server/scripts]# openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11
vtrowtjefi

2、命令行手工搞定一个

[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# echo $random
qvnprjvpey
[root@web01 /server/scripts]# echo $random
qvnprjvpey
[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# echo $random
ftlhpzuvcg
[root@web01 /server/scripts]# touch ${random}_oldboy.html
[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# touch ${random}_oldboy.html

3、搞定多个脚本for循环

[root@web01 /server/scripts]# vim 19_1_1.sh
#!/bin/bash
##############################################################
# File Name: 19_1_1.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
Path=/oldboy
[ -d $Path ] || mkdir $Path
for n in {1..10}
do
    random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
    touch $Path/${random}_oldboy.html                                                                  
done
                                                  
[root@web01 /server/scripts]# sh 19_1_1.sh
[root@web01 /server/scripts]# ls /oldboy/
hdsktbnueg_oldboy.html  ndiwjuwlmc_oldboy.html  sofpatdies_oldboy.html  xatlfezzzq_oldboy.html
ierjzagjho_oldboy.html  phsdsrbrej_oldboy.html  vlamkzfoac_oldboy.html
knsujjmavg_oldboy.html  rhobejmimj_oldboy.html  wxmrqzxjcz_oldboy.html

19.1.2 企业Shell面试题2:批量改名特殊案例
将上面试题19.1.1中结果文件名中的oldboy字符串全部改成oldgirl(最好用for循环实现),并且将扩展名html全部改成大写HTML。
三种方法实现:

1、先命令行处理一个

[root@web01 /oldboy]# file1=kfixfkghqz_oldboy.html
[root@web01 /oldboy]# mv $file1 ${file1/oldboy.html/oldgirl.HTML}

2、脚本处理多个
方法1:

Path=/oldboy
[ -d $Path ] || mkdir $Path
cd $Path
for file1 in `ls`
do
    mv $file1 ${file1/oldboy.html/oldgirl.HTML}                                                        
done

方法2:
rename专业改名

[root@web01 /oldboy]# rename "oldgirl.HTML" "oldboy.html" *HTML
[root@web01 /oldboy]# ls
fzewmfbowb_oldboy.html  kfixfkghqz_oldboy.html  qaxuezrdyh_oldboy.html  vkftijhssz_oldboy.html
ibcmutcmyj_oldboy.html  ovqxxevhlw_oldboy.html  rkoxkozsfs_oldboy.html
inpdcqsmfo_oldboy.html  paoreutqqd_oldboy.html  sksdayeamk_oldboy.html
[root@web01 /oldboy]# rename "oldboy.html" "oldgirl.HTML" *html
[root@web01 /oldboy]# ls
fzewmfbowb_oldgirl.HTML  kfixfkghqz_oldgirl.HTML  qaxuezrdyh_oldgirl.HTML  vkftijhssz_oldgirl.HTML
ibcmutcmyj_oldgirl.HTML  ovqxxevhlw_oldgirl.HTML  rkoxkozsfs_oldgirl.HTML
inpdcqsmfo_oldgirl.HTML  paoreutqqd_oldgirl.HTML  sksdayeamk_oldgirl.HTML

方法3:

mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML

[root@web01 /oldboy]# ls *.html|awk -F '_' '{print "mv",$0,$1"_oldgirl.HTML"}'
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv ibcmutcmyj_oldboy.html ibcmutcmyj_oldgirl.HTML
mv inpdcqsmfo_oldboy.html inpdcqsmfo_oldgirl.HTML
mv kfixfkghqz_oldboy.html kfixfkghqz_oldgirl.HTML
mv ovqxxevhlw_oldboy.html ovqxxevhlw_oldgirl.HTML
mv paoreutqqd_oldboy.html paoreutqqd_oldgirl.HTML
mv qaxuezrdyh_oldboy.html qaxuezrdyh_oldgirl.HTML
mv rkoxkozsfs_oldboy.html rkoxkozsfs_oldgirl.HTML
mv sksdayeamk_oldboy.html sksdayeamk_oldgirl.HTML
mv vkftijhssz_oldboy.html vkftijhssz_oldgirl.HTML
[root@web01 /oldboy]# 
[root@web01 /oldboy]# 
[root@web01 /oldboy]# ls *.html|awk -F '_' '{print "mv",$0,$1"_oldgirl.HTML"}'|bash
[root@web01 /oldboy]# ls
fzewmfbowb_oldgirl.HTML  kfixfkghqz_oldgirl.HTML  qaxuezrdyh_oldgirl.HTML  vkftijhssz_oldgirl.HTML
ibcmutcmyj_oldgirl.HTML  ovqxxevhlw_oldgirl.HTML  rkoxkozsfs_oldgirl.HTML
inpdcqsmfo_oldgirl.HTML  paoreutqqd_oldgirl.HTML  sksdayeamk_oldgirl.HTML
#!/bin/sh
Filename=_oldgirl.HTML
Dirname="/oldboy"
cd $Dirname||exit 1
for n in `ls`  
do
    name=$(echo ${n}|awk -F '_' '{print $1}')
    mv $n ${name}${Filename}
done

19.1.1 企业Shell面试题1:批量生成随机字符文件名案例

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含oldboy固定字符串加10个随机小写字母,名称示例如下:

[root@oldboy scripts]# ls /oldboy
oldboy_amaeeurmja.html  oldboy_jmtiqwhinw.html  oldboy_rnbwmjkjkh.html  oldboy_yhufdiceox.html
oldboy_antodvkjcf.html  oldboy_ncivkckvok.html  oldboy_tyqfhfxvup.html
oldboy_epwmszmttm.html  oldboy_osjmrurgsx.html  oldboy_vpgslhajdn.html

19.1.3 企业Shell面试题3:批量创建特殊要求用户案例

批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机数,要求字符和数字等混合)。
不用for循环的实现思路:http://user.qzone.qq.com/49000448/blog/1422183723
解答:
本题的详细答案见第11章范例11_14,此处仅作为Shell案例集中收集整理。

范例12_4:已知下面的字符串是通过将RANDOM随机数采用md5sum加密后任意取出连续10位的结果,请破解这些字符串对应的md5sum前的数字?
4fe8bf20ed

19.1.8 企业Shell面试题8:筛选符合长度的单词案例

利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy training class
解答:
本题的详细答案见第13章范例13_4,此处仅作为Shell案例集中收集整理。

1)字符串长度

[root@web01 /server/scripts]# oldboy="I am oldboy."
[root@web01 /server/scripts]# echo ${#oldboy}
12
[root@web01 /server/scripts]# echo ${oldboy}|wc -L
12
[root@web01 /server/scripts]# expr length "${oldboy}"
12
[root@web01 /server/scripts]# echo $oldboy|awk '{print length}'
12
[root@web01 /server/scripts]# echo $oldboy|awk '{print length($0)}'
12

chars="I am oldboy teacher welcome to oldboy training class"
for word in $chars
do
    if [ ${#word} -le 6 ]
    then
        echo $word
    fi
done                                                                                                   

[root@web01 /server/scripts]# sh 19_1_8.sh
I
am
oldboy
to
oldboy
class

19.1.1 企业Shell面试题1:批量生成随机字符文件名案例

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含oldboy固定字符串加10个随机小写字母,名称示例如下:

[root@oldboy scripts]# ls /oldboy
oldboy_amaeeurmja.html  oldboy_jmtiqwhinw.html  oldboy_rnbwmjkjkh.html  oldboy_yhufdiceox.html
oldboy_antodvkjcf.html  oldboy_ncivkckvok.html  oldboy_tyqfhfxvup.html
oldboy_epwmszmttm.html  oldboy_osjmrurgsx.html  oldboy_vpgslhajdn.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值