基于CentOS7 常用shell脚本集合

目录

  • 1、批量生成随机字符文件名
  • 2、批量改名
  • 3、批量创建特殊要求用户
  • 4、扫描网络内存活主机案例
  • 5、写一个Shell脚本解决类DDoS攻击的生产案例。
  • 6、MySQL数据库分库备份
  • 7、MySQL数据库分库分表备份
  • 8、筛选符合长度的单词
  • 9、比较整数大小
  • 10、菜单选择
  • 11、同时检测多个url是否正常(实际工作)
  • 12、Nginx进程检查(通用)
  • MySQL服务
  • 12、开发脚本实现入侵检测与报警
  • 13、nginx(编译安装) systemctl启动脚本
  • 14、CentOS7.8下开发systemctl管理的自定义Rsync启动服务程序
  • 15、开发学生实践抓阐脚本
  • 16、破解RANDOM随机数

环境:基于centos7

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

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

知识储备:随机数生成
方法1:
openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11
#生成40位随机数字,替换掉不是小写字符的,cut截取10位字母
---------------------------------------------------
脚本实现:
[root@m01 /server/scripts/web01/shell]#cat  file_name.sh
#!bin/bash
Path=/oldboy
[ -d $Path ]||mkdir $Path
cd $Path
for n in {1..10}
do
    random=`openssl rand -base64 45|sed 's#[^a-z]##g'|cut -c 1-10`
    touch $Path/${random}_oldboy.html
done

2、批量改名

在上一题的基础上把oldboy改成oldgirl,小写的后缀改成大写的。

知识储备:mv 更改文件名
file1=gmbumhxazk_oldboy.html
echo ${file1/oldboy.html/oldgirl.HTML}
mv $file1 ${file1/oldboy.html/oldgirl.HTML}

脚本:
[root@m01 /server/scripts]#cat 19_1_2.sh
#!bin/bash
Path=/oldboy
[ -d $Path ]||mkdir $Path
cd $Path
for file in `ls *_oldboy.html`
do
mv $file ${file/oldboy.html/oldgirl.HTML}
done
----------------------------------------
扩展:方法2:rename
rename "oldgirl.HTML" "oldboy.html"  *HTML
         from              to        针对后缀为HTML的文件
示例:gmbumhxazk_oldboy.html 
[root@m01 /oldboy]#rename "oldboy.html" "oldgirl.HTML" *html
[root@m01 /oldboy]#ls
gmbumhxazk_oldgirl.HTML

-------------------------------
方法3:awk命令拼接
实现:mv  hznbmkezvq_oldboy.html  hznbmkezvq_oldgirl.HTML
ls *html|awk -F "[_.]" '{print "mv",$0,"oldgirl_"$2".HTML"}'
以上命令相当于mv oldboy_ciskonulft.html oldgirl_ciskonulft.HTML
ls *html|awk -F "[_.]" '{print "mv",$0,"oldgirl_"$2".HTML"}'|bash     交给bash执行

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

批量创建10个系统账号oldboy01-oldboy10并设置密码(密码为随机数,要求是字符和数字等的混合)。

[root@m01 /server/scripts]#cat 19_1_3.sh
#!bin/bash
. /etc/init.d/functions
for user in oldboy{01..10}
do
    passwd=`echo $user|md5sum|cut -c 1-8`  #创建随机密码
    if [ `id $user 2>/dev/null|wc -l` -ge 1 ]     #错误定向到空,判断用户是否存在
    then
        action "The $user already exists." /bin/false
        continue
    else
        useradd $user &>/dev/null &&{
            echo "$passwd"|passwd --stdin $user &>/dev/null  #创建密码,不输出
            echo -e "$user\t$passwd" >>/tmp/user.txt          #把密码写入文件
        }
        if [ $? -eq 0 ];then
            action "create $user successfully!" /bin/true
        else
            action "create $user with error!" /bin/false
        fi
    fi
done

4、扫描网络内存活主机案例

写一个shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?

[root@m01 /server/scripts]#cat 19_1_14.sh
#!bin/bash
for n in {1..254}
do
    {
    ping -W 2 -c 2 10.0.0.$n &>/dev/null  #-W 超时时间 ,-c次数
    if [ $? -eq 0 ]
    then
        echo "10.0.0.$n is alive."
    #else
    #   echo "10.0.0.$n is dead."
    fi
   }&
done
---------------------------------------------------------------------------------------------------------------
nmap命令-网络探测工具和安全和端口扫描器
 -sP:进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试(如端口扫描或者操作系统探测)-sS:TCP SYN扫描,只扫描不进行连接,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。

nmap -sP 10.0.0.0/24|awk '/Nmap scan report for/{print $NF}' #只返回存活ip

用来检查远端服务端口是否通畅
nmap 10.0.0.7 -p 80|grep open|wc -l  #存活返回1

5、写一个Shell脚本解决类DDoS攻击的生产案例。

请根据Web日志或系统网络连接数,监控某个IP的并发连接数,若短时内PV达到100,即调用防火墙命令封掉对应的IP。防火墙命令为:“iptables -I INPUT -s IP地址 -j DROP”。
参考答案:
先分析Web日志,可以每分钟或每小时分析一次,这里给出按小时处理的方法。
可以将日志按小时进行分割,分成不同的文件,根据分析结果把PV数高的单IP封掉。例如,每小时单IP的PV数超过500,则即刻封掉,这里简单地把日志的每一行近似看作一个PV,实际工作中需要计算实际页面的数量,而不是请求页面元素的数量,另外,很多公司都是以NAT形式上网的,因此每小时单IP的PV数超过多少就会被封掉,还要根据具体的情况具体分析,本题仅给出一个实现的案例,读者使用时需要考虑自身网站的业务去使用。

知识储备:
iptables -L -n:查看ip的访问情况
uniq  用于报告或者忽略重复行
	-c:count,在该行显示重复连接的次数
	-d:仅显示重复出现的行列
	-u:仅显示出现一次的行列

sort    对文本文件内容进行排序,可以针对文件的内容按照单位进行排序
	-r:以相反的顺序来排序
	-b:忽略每行前面开始出现的空行
	-c:检查文件是否已经按照顺序排序
	-n:按照数值大小排序
	-o:将排序后的内容结果指定到文件当中
	-t:分个字符,指定排序时所用的栏位分隔字符
	------------------------------------------
[root@web02 /server/scripts]#vim ctrl_ddos.sh
#!/bin/sh
function check(){
netstat -an >netstat.log
#对文件进行处理,把外网访问的所有的ip地址进行分类按,访问次数进行排名,导入到一个临时的文件,然后对这个临时文件进行提取ip和次数
awk -F "[: ]+" '/ESTABLISHED/{print $(NF-2)}' 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 500 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]
      then
         echo "$ip is dangerous!"
         iptables -I INPUT -s $ip -j DROP  #封杀pv大于500的ip,测试可以个位数
         echo "$line is dropped." >>/tmp/droplist_$(date +%F).log  #导出日志
      else
         echo "$line is safe."
      fi
    done</tmp/ip.log

}
main(){
  while true
  do
     check
     sleep 180
  done
}

6、MySQL数据库分库备份

[root@web02 /server/scripts]#cat mysql_backup_db.sh
#!/bin/sh
user=root
passwd=密码
backup=/tmp/mysql
[ -d $backup ]||mkdir /tmp/mysql -p
for dbname in `mysql -u${user} -p${passwd} -e "show databases;" 2>/dev/null|sed 1d|egrep -v "_schema"`
do
    mysqldump -u${user} -p${passwd} -B $dbname 2>/dev/null|gzip >${backup}/${dbname}_$(date +%F).sql.gz
done

解决mysql与mysqldump要用户密码问题:在/etc/my.cnf加入模块的用户密码,授权:chmod 400 /etc/my.cnf
mysql.sock被删除了,systemctl restart mysqld就行了

7、MySQL数据库分库分表备份

[root@web02 /server/scripts]#cat mysql_backup_tables.sh
#!/bin/sh
user=root
passwd=密码
backup=/tmp/mysql
[ -d $backup ]||mkdir /tmp/mysql -p
for dbname in `mysql -u${user} -p${passwd} -e "show databases;" 2>/dev/null|sed 1d|egrep -v "_schema"`
do
    for tablename in `mysql -e "show tables from $dbname;"|sed 1d`
    do
      mysqldump -u${user} -p${passwd} --lock-tables=0 $dbname $tablename 2>/dev/null|gzip >${backup}/${dbname}_${tablename}_$(date +%F).sql.gz
done
done

8、筛选符合长度的单词

利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy training class

知识储备:
计算变量长度
如word=sakjndhkasj
echo ${#word}
echo ${word|wc -L
xpr length "${word}"
echo $word|awk '{print length}'
echo $word|awk '{print length($0)}'
-------------------------------------
[root@m01 /server/scripts/web01/shell]#cat word.sh
#!bin/bash
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@m01 /server/scripts]#cat word.sh
#!bin/bash
arr=(I am oldboy teacher welcome to oldboy training class)
for n in ${#arr[*]}
do
	if [ ${#arr[n]} -le 6 ]
	then
		echo "${arr[n]}"
	fi
done

9、比较整数大小

综合实战案例:开发Shell脚本分别实现以脚本传参及read读入的方式比较2个整数大小。用条件表达式(禁止if)进行判断并以屏幕输出的方式告知用户比较的结果。
注意:一共要开发2个脚本。当使用脚本传参及read读入的方式时,需要对变量是否为数字,以及传参个数是否正确给予提示。

[root@m01 /server/scripts]#cat 6_35_1.sh
#!bin/bash
read -p "please input two num:" a b
judge(){
    [ -z "$a" ]||[ -z "$b" ]&&{
        echo "please input two num again."
        exit 1
    }
    expr $a + $b + 10 &>/dev/null
    [ $? -eq 0 ]||{
       echo "please input two num again."
       exit 1
    }
}
compare(){
    [ $a -lt $b ]&&{
        echo "$a < $b"
        exit 0
    }
    [ $a -eq $b ]&&{
        echo "$a = $b"
        exit 0
    }
    [ $a -gt $b ]&&{
        echo "$a > $b"
        exit 0
    }
}
main(){
    judge
    compare
}
main

-----------------------------------
if方法:
[root@m01 /server/scripts]#cat compare.sh
#!bin/bash
compare(){
    read -p "please input two num:" a b 
    expr $a + $b + 10 &>/dev/null
    if [ $? -eq 0 ]
    then
        if [ $a -lt $b ];then
            echo "$a < $b"
        elif [ $a -eq $b ];then
            echo "$a = $b"
        else
            echo "$a > $b"
        fi
    else
        echo "please input two num again."
    fi
}
main(){
    compare
}
main

10、菜单选择

打印选择菜单。

[root@m01 /server/scripts]#cat guess.sh
#!bin/bash
cat<<EOF
1.doc
2.cat
3.pig
4.exit
EOF
while true
do
    read -p "please input your num:" n
    case $n in
        1)
             echo "I guess,you like doc."
             ;;
        2)
             echo "I guess,you like cat."
             ;;
        3)
             echo "I guess,you like pig."
             ;;
       4|*)
             echo "I don't know what you like"
             exit
esac
done

11、同时检测多个url是否正常(实际工作)

[root@m01 /server/scripts]#cat check_url.sh
#!bin/bash
. /etc/init.d/functions
check_count=0
url_list=(
http://www.baidu.com
http://blog.etiantian.org
http://10.0.0.7
)
wait_url(){
    echo -n '3秒后,进行检查URL操作.'
    for  ((i=0;i<3;i++))
    do
        echo -n "."
        sleep 1
    done
    echo
}
check_url(){
    wait_url
    a=`echo ${#url_list[*]}`
    for  ((i=0;i<$a;i++))
    do
        wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1
        #wget -q ${url_list[$i]}
        if [ $? -eq 0 ];then
            action "${url_list[$i]}" /bin/true
        else
            action "${url_list[$i]}" /bin/false
        fi
    done
    ((check_count++))
}
main(){
    while true
    do
        check_url
        echo "----------check count:${check_count}---------"
        sleep 10
    done
}
main

12、Nginx进程检查(通用)

知识储备:
查看服务与端口号
netstat -lntup|grep 3306|wc -l
netstat -lntup|grep mysql|wc -l
ss -lntup|grep mysql   #ss类似于netstat 
lsof -i :3306
ps -ef|grep nginx|grep -v grep|wc -l


--------------------------
[root@m01 /server/scripts]#cat nginx.sh 
#!bin/bash
if [ ` ps -ef | grep -v grep | grep nginx | wc -l ` -ge 1 ]
then
    echo "Nginx is Running."
else
    echo "Nginx is Stopped."
Fi
-----------------------------------------------
yum install telnet nmap nc -y
nmap 127.0.0.1 -p 3306|grep open|wc -l
#<==查看远端3306端口是否开通,过滤open关键字,结果返回1,说明有open关键字,表示3306端口是通的。

echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null/grep Connected|wc -l
#<==telnet是常用来检测远端服务器端口是否通畅的一个好用的命令,在非交互时需要采用特殊写法才行,过滤的关键字为Connected,返回1,说明有Connected,表示3306端口是通的。

nc -w 2 127.0.0.1 3306 &/dev/null 
#<==nc的命令很强大,这里用来检测端口。根据执行命令的返回值判断端口是否通畅,如果返回0,则表示通畅,-w为超时时间。

扩展

检测服务
yum install telnet nmap nc -y
nmap 127.0.0.1 -p 3306|grep open|wc -l
#查看远端3306端口是否开通,过滤open关键字,结果返回1,说明有open关键字,表示3306端口是通的。

echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null/grep Connected|wc -l
#telnet是常用来检测远端服务器端口是否通畅的一个好用的命令,在非交互时需要采用特殊写法才行,过滤的关键字为Connected,返回1,说明有Connected,表示3306端口是通的。

nc -w 2 127.0.0.1 3306 &/dev/null 
#nc的命令很强大,这里用来检测端口。根据执行命令的返回值判断端口是否通畅,如果返回0,则表示通畅,-w为超时时间。

=========================================================================================

检测网站url:
wget --spider --timeout=10 --tries=2 www.baidu.com  &>/dev/null
#wget后面加url的检测方法,&>/dev/nul1表示不输出,只看返回值。--spider的意思是模拟爬取,--timeout=10的意思是10秒超时,--tries=2表示如果不成功,则重试2次。

wget -T 10 -q --spider http://www.baidu.com &>/dev/null
#用法同第一个wget,-q表示安静的。

curl -s -o /dev/null http://www.baidu.com &>/dev/null
#利用curl进行检测,-s为沉默模式,-o /dev/null表示将输出定向到空。

MySQL服务

if [ `netstat -lntup|grep mysqld|wc -l` -gt 0 ]
then
    echo "MySQL is running."
    exit 0
else
    echo "MySQL is Stopped."
    systemctl start mysqld
fi

12、开发脚本实现入侵检测与报警


监控Web站点目录(/var/html/www)下的所有文件是否被恶意篡改(文件内容被更改了),如果有则打印改动的文件名(发邮件),定时任务每3分钟执行一次。
1、问题分析
文件内容被改:大小数量、修改时间会变-----利用md5sum指纹校验。
2、解答:
1)建立数据
2)建立初始文件指纹库与文件库
3、检验文件内容与数量
4、开发检查指纹识别脚本
#选取/application/nginx/html作为站点目录,建立文件内容指纹库----md5sum -c可以检测文件内容变化
[root@web02 /]#find /application/nginx/html -type f|xargs md5sum >/opt/fingerprint.db.ori

#建立文件数量和名字库-----备份的文件与站点的文件比对可以检测被篡改的文件
[root@web02 /]#find /application/nginx/html -type f >/opt/file.db.ori

[root@web02 /server/scripts]#cat  19_14_1.sh
#!/bin/sh
retval=0
fgprint_path=/opt/fingerprint.db.ori
file_db_path=/opt/flie.db.ori
error_log=/opt/web_error.log
check_dir=/application/nginx/html
[ -e $check_dir ]||exit 1
#judge file content
echo "--------------$(date +%F,%T)-------------" >>$error_log
echo '#md5sum -c --quiet /opt/fingerprint.db.ori' >>$error_log
md5sum -c --quiet $fgprint_path &>>$error_log
retval=$?

#judge file count
find $check_dir -type f >/opt/file.db_curr.ori
echo "#diff /opt/file.db*" &>>$error_log
diff /opt/file.db* &>>$error_log

if [ $retval -ne 0 -o `diff /opt/file.db*|wc -l` -ne 0 ]
then
   echo "Site with error!"
else
   echo "Site is ok."
fi

13、nginx(编译安装) systemctl启动脚本

nginx编译安装参考方法2:https://blog.csdn.net/qq_42468502/article/details/108815245

13.1 脚本:
[root@web01 /etc/init.d]#cat nginxd 
#!bin/bash
#description:stop/start nginx server

path=/application/nginx/sbin
retval=0
. /etc/init.d/functions

function start(){
    if [ `netstat -lntup|grep nginx|wc -l` -eq 0 ];then
        $path/nginx
        retval=$?
        if [ $retval -eq 0 ];then
            action $"nginx is started." /bin/true
        else
            action $"nginx is started." /bin/false
            return $retval
        fi
    else
        echo "nginx is running."
        return 0
    fi
}

function stop(){
    if [ `netstat -lntup|grep nginx|wc -l` -eq 1 ];then
        $path/nginx -s stop
        retval=$?
        if [ $retval -eq 0 ];then
            action $"nginx is stopped." /bin/true
            return $retval
        else
            action $"nginx is stopped." /bin/false
            return $retval
        fi
    else
        echo "nginx is no running."
        return $retval
    fi
}
case "$1" in
    start)
        start
        retavl=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    resart)
        stop
        sleep 2
        start
        retval=$?
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac
exit $retval

13.2 授予脚本执行权限:
chmod  +x  /etc/init.d/nginxd

13.3 测试脚本:
[root@web01 /etc/init.d]#sh nginx.sh start
nginx is running.
[root@web01 /etc/init.d]#sh nginx.sh stop
nginx is stopped.

13.4 server配置:
[root@web01 /usr/lib/systemd/system]#cat nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/application/nginx/logs/nginx.pid
ExecStart=/etc/init.d/nginxd start
ExecReload=/etc/init.d/nginxd restart
ExecStop=/etc/init.d/nginxd stop
[Install]
WantedBy=multi-user.target

授予权限:
chmod  +x  /usr/lib/systemd/system/nginx.service
用法:systemctl start|stop|restart  nginx

14、CentOS7.8下开发systemctl管理的自定义Rsync启动服务程序

rpm  -qa rsync 查看是否安装rsyncd服务

server服务配置文件:
[root@web01 /]#vim /etc/systemd/system/rsyncd_oldboy.service
[Unit]
Description=Rsync service
After=network.target
[Service]
Type=forking
PIDFile=/var/run/rsyncd.pid
ExecStart=/etc/rc.d/init.d/rsyncd start
ExecReload=/etc/rc.d/init.d/rsyncd restart
ExecStop=/etc/rc.d/init.d/rsyncd stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target

启动脚本:
[root@web01 /]#cat /etc/rc.d/init.d/rsyncd
#!/bin/bash
if [ $# -ne 1 ]
then
    echo $"usage:$0 {start|stop|restart}"
    exit 1
fi
if [ "$1" = "start" ]
then
    rsync --daemon
    sleep 2
    if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ]
    then
        echo "rsyncd is started."
        exit 0
    fi
elif [ "$1" = "stop" ]
then
    killall rsync $>/dev/null
    sleep 2
    if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ]
    then
        echo "rsyncd is stopped."
        exit 0
    fi
  if [ "$1" = "restart" ]
then
    killall rsync
    sleep 1
    killpro=`netstat -lntup|grep rsync|wc -l`
    rsync --daemon
    sleep 1
    startpro=`netstat -lntup|grep rsync|wc -l`
    if [ $killpro -eq 0 -a $startpro -ge 1 ]
    then
        echo "rsyncd is restarted"
        exit 0
    fi
else
    echo $"usage:$0 {start|stop|restart}"
    exit 1
fi

测试:
[root@web01 /etc/systemd/system]#systemctl start rsyncd_oldboy.service
Warning: rsyncd_oldboy.service changed on disk. Run 'systemctl daemon-reload' to reload units.

[root@web01 /etc/systemd/system]#systemctl daemon-reload

[root@web01 /etc/systemd/system]#systemctl start rsyncd_oldboy.service
[root@web01 /etc/systemd/system]#lsof -i :873

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   5242 root    3u  IPv4  68562      0t0  TCP *:rsync (LISTEN)
rsync   5242 root    5u  IPv6  68563      0t0  TCP *:rsync (LISTEN)

[root@web01 /etc/systemd/system]#systemctl stop rsyncd_oldboy.service
[root@web01 /etc/systemd/system]#lsof -i :873

15、开发学生实践抓阐脚本

学生有去企业项目实践的机会,但是,名额有限,仅限3人(班长带队)。
因此需要开发一个抓间的程序来挑选学生,具体要求如下:
1)执行脚本后,输入想去的同学的英文名字全拼,产生随机数(01~99之间的数字),数字越大就越有机会去参加项目实践,对于前面已经抓到的数字,下次不能再出现。
2)输入第一个名字之后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。
答案转自:天津项目学生实践抓阄题目

方法1:
>/tmp/a.log
while true
do
    while true
    do
        random=`echo $((RANDOM%99))`
        if [ `grep -w $random /tmp/a.log|wc -l` -eq 1 ]
        then
            random=`echo $((RANDOM%99))`
        else
            break
        fi
    done
    read -p "请输入姓名全拼:" name
    if [ "$name"  == "exit" ]
    then
        echo "抓阄结束,结果如下"
        break
    else
        echo -e "$random\t$name"|tee -a /tmp/a.log
    fi
done
sort -rn -k1 /tmp/a.log|head -3

方法2:
[root@oldboy scripts]# cat zhuajiu1.sh 
#!/bin/bash
>/tmp/name.log
random(){
    random="$((RANDOM%100))"
    if [ `egrep -w "$random" /tmp/name.log|wc -l` -ge 1 ]
    then
        continue
    fi
}
name(){
    read -p "请输入你的名字的全拼:" name
    if [ "$name" = "exit" ];
    then
        break
    fi
    if [ `egrep -w "$name" /tmp/name.log|wc -l` -ge 1 ]
    then
        echo "名字重复,请重新输入"
        continue
    fi
    echo -e "$random\t\t$name"|tee -a /tmp/name.log
}
main(){
    while true
    do
        random
        name
    done
    echo "抓阄结束,排序结果如下:"
    sort -rn -k1 /tmp/name.log|head -3
}
main

16、破解RANDOM随机数

已知下面的字符串是通过将RANDOM随机数采用md5sum加密后任意取出连续10位的结果,请破解这些字符串对应的md5sum前的数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b

1、RANDOM范围0-32767

#!bin/bash
arr=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)

Num=0
get_md5() {
        >md5.txt #第一次创建,装随机数
        #for  n  in  {1..32767}
        for  ((Num=0;Num<=32767;Num++))  
        do
             {   #大括号内容并发执行
                Stat=$(echo $Num|md5sum|cut -c 1-8)
                echo "$Stat $Num" >> md5.txt   #建立数字和md5sum后内容的对应关系
            }&
        done
        return 0
}
find_md5() {
    word=$(echo "${arr[@]}"|sed -r 's# |\n#|#g')  #把数组整成一行:21029299|00205d1c|a3da1677|1f6d12dd|890684b
    grep -E "$word" md5.txt
}

main() {
    if [ ! -s md5.txt ]  #如果文件大小为0
    then
       get_md5
    fi
       find_md5
}
main

你可能感兴趣的:(Linux基础知识,shell)