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