Linux(17):Shell编程(4)

案例1:批量生成随机字 符 文件名案例

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

[root@oldgirl C19]# ls /neo
apquvdpqbk_neo.html mpyogpsmwj_neo.html txynzwofgg_neo.html
bmqiwhfpgv_neo.html mtrzobsprf_neo.html vjxmlflawa_neo.html
jhjdcjnjxc_neo.html qeztkkmewn_neo.html
jpvirsnjld_neo.html ruscyxwxai_neo.html

参考如下:

# 生成随机数的方式:
echo $RANDOM                          # 随机数的范围: 0~32767
openssl rand -base64 10                # 10 表示要生成的随机数的长度
date +%s%N                            # 用时间做随机数
head /dev/urandom |cksum        
uuidgen                                # 利用uuid
cat /proc/sys/kernel/random/uuid
mkpasswd                             # 需要先安装 expect ; yum install expect -y
    l 总长度
    d 数字个数
    c 小写字母个数
    C 大写字母个数
    s 特殊字符个数

# 示例:
[root@m01 ~]# mkpasswd -l 20 -d 17 -C 1 -c 1 -s 1
1194S1242h756%909877

    
# 获取到随机10个小写字母
[root@m01 ~]# echo "OLDBOY$RANDOM"
OLDBOY31600
[root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum
2b33f154112a2f371beba1600d24f246  -
[root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j
icfafgebagjaajeieifeifabgfhfeegj  -
[root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j |cut -c 2-11
afbagebbdf            # 获取到随机10个小写字母
[root@m01 ~]# 

[root@m01 ~]# mkpasswd -l 10 -d 0 -C 0 -c 10 -s 0        # 获取到随机10个小写字母
tkbviqfovu
[root@m01 ~]#


echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j |cut -c 2-11
    echo "123456" | md5sum                    # 查看一个字符串的md5值
    cat file | tr [0-9] [a-j]                 # 把文件中的数字0-9替换为a-j
    cut -c 2-11                                # -c参数表示 仅显示行中指定范围的字符

# 示例代码:
[root@m01 cases]# cat case01.sh
#!/bin/bash
##############################################################
# File Name: case01.sh
# Version: V1.0
# Author: neo
# Organization: anonymous
# Created Time : 2019-07-04 11:15:30
# Description:
##############################################################
path=/neo
[ -d $path ] || mkdir -p $path      # 如果 /neo 目录不存在则创建

for n in {1..10}
do
    random=`mkpasswd -l 10 -d 0 -C 0 -c 10 -s 0`
    touch $path/${random}_neo.html
done
[root@m01 cases]# sh case01.sh
[root@m01 neo]# ll
total 0
-rw-r--r-- 1 root root 0 Jul  4 11:23 hqxdsueipv_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 jpiauceiiy_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 lagtetdxnu_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 ogkstnleki_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 qkljrkpckc_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 rpslndkrjc_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 snvcqbwlko_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 tuwsslvcgn_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 tzxismkjka_neo.html
-rw-r--r-- 1 root root 0 Jul  4 11:23 wlaroblbvi_neo.html
[root@m01 neo]# 

案例2:批量改名特殊案例 

将以上案例1中结果文件名中的 neo 字符串全部改成 Neomaple,最好用 for 循环实现并且将扩展名html全部改成大写

参考如下:

# 方式一:for 循环
[root@m01 cases]# cat case02.sh
#!/bin/bash
for file in `ls /neo/*.html`
do
    mv $file /${file/neo.html/Neomaple.HTML}
done
[root@m01 cases]# 

# 方式二:awk 
[root@m01 neo]# ls *.html|awk -F "neo.html" '{print "mv",$0,$1"Neomaple.HTML"}'
mv dbizjjvosl_neo.html dbizjjvosl_Neomaple.HTML
mv ezoiojifzy_neo.html ezoiojifzy_Neomaple.HTML
mv fanspikyqs_neo.html fanspikyqs_Neomaple.HTML
mv hmvkxpoyru_neo.html hmvkxpoyru_Neomaple.HTML
mv hymssbshwu_neo.html hymssbshwu_Neomaple.HTML
mv kgavlirhts_neo.html kgavlirhts_Neomaple.HTML
mv khxcbyrnnt_neo.html khxcbyrnnt_Neomaple.HTML
mv ntgtztpzsp_neo.html ntgtztpzsp_Neomaple.HTML
mv pfykhbwgyk_neo.html pfykhbwgyk_Neomaple.HTML
mv sybwbmnmyh_neo.html sybwbmnmyh_Neomaple.HTML
[root@m01 neo]# ls *.html|awk -F "neo.html" '{print "mv",$0,$1"Neomaple.HTML"}'|bash
    
# 方式三:rename
[root@m01 neo]# rename "neo.html" "Neomaple.HTML" *.html    # 把 neo.html 改成 Neomaple.HTML ;*.html 表示针对 以 html结尾的文件

案例3:批量创建特殊要求用户案例

批量创建10个系统帐号 neo01 - neo10 并设置密码(密码为随机数 ,要求字符和数字等混合)

# 分析:
1) 生成01~10的序列:
        echo {01..10}
        seq -w 10
2) 随机数: 
        openssl rand -base64 10
3) 创建用户和密码:
        useradd neo01                    # 创建用户
        # 设置密码方法1:
        echo 密码 |passwd --stdin 用户名    
        # 设置密码方法2:
        chpasswd 命令
            chpasswd 设置密码时,用户名和密码要遵守这种格式: 用户名:密码
4) for 循环

# 方式一:
[root@m01 cases]# cat case03.sh
#!/bin/bash
for n in {01..10}
do
    passwd=`openssl rand -base64 10`    # 要把随机密码保存到变量中
    useradd neo$n
    echo $passwd|passwd --stdin neo$n
    echo -e "neo$n\t$passwd" >>/tmp/user.list   # 把密码保存到文件中; echo -e 的作用是 解析 \t
done
[root@m01 cases]# sh case03.sh
Changing password for user neo01.
passwd: all authentication tokens updated successfully.
Changing password for user neo02.
passwd: all authentication tokens updated successfully.
Changing password for user neo03.
passwd: all authentication tokens updated successfully.
Changing password for user neo04.
passwd: all authentication tokens updated successfully.
Changing password for user neo05.
passwd: all authentication tokens updated successfully.
Changing password for user neo06.
passwd: all authentication tokens updated successfully.
Changing password for user neo07.
passwd: all authentication tokens updated successfully.
Changing password for user neo08.
passwd: all authentication tokens updated successfully.
Changing password for user neo09.
passwd: all authentication tokens updated successfully.
Changing password for user neo10.
passwd: all authentication tokens updated successfully.    
[root@m01 cases]# cat /tmp/user.list 
neo01    pFvlvG0NXpIvYg==
neo02    UPRO/U7uTxnJNw==
neo03    0xkAtO5U70ws5w==
neo04    wXR+K7fl+8i5wA==
neo05    7bt6b09wv5dw7Q==
neo06    AUNPXdRaJ8NUTA==
neo07    E+JPwENB7KXHUA==
neo08    1lZylckuf8rNlg==
neo09    ZD7qVwMfsPMvzg==
neo10    B3EgYyb/swvDow==
[root@m01 cases]# su - neo01
[neo01@m01 ~]$ su - neo02
Password: 
[neo02@m01 ~]$ whoami
neo02
[neo02@m01 ~]$ 

# 方式二:
[root@m01 cases]# cat case0302.sh
#!/bin/bash
for n in `seq -w 11 15`
do
    passwd=`openssl rand -base64 10`    # 要把随机密码保存到变量中
    useradd neo$n
    echo "neo$n:$passwd" >>/tmp/chpasswd.log    # 把用户名和密码以 用户名:密码 这种格式保存到 一个文件 chpasswd.log 中
done

chpasswd </tmp/chpasswd.log     # 把 /tmp/chpasswd.log 这个文件通过输出重定向 给 chpasswd 命令处理,由于 chpasswd.log 中是以 用户名:密码 格式保存的,所以 chpasswd 命令能直接处理
[root@m01 cases]# sh case0302.sh
[root@m01 cases]# cat /tmp/chpasswd.log 
neo11:Ij76k7pbfyByZQ==
neo12:lmCPKpKoUP/UOg==
neo13:JNIfuo8wwXgEkA==
neo14:QkBxlLf6mhQP+g==
neo15:fbvtdTSu9yTySg==
[root@m01 cases]# su - neo11
[neo11@m01 ~]$ su - neo15
Password: 
[neo15@m01 ~]$ 


# 方式三:
[root@m01 cases]# cat case0303.sh
#!/bin/bash
. /etc/init.d/functions

if [ $UID -ne 0 ]
then
    action "only root can execute this script" /bin/false
    exit 1
fi

for n in {12..17}
do
    passwd=`openssl rand -base64 10`
    if `! grep -w  "neo$n" /etc/passwd &>/dev/null`   # grep -w 表示精确匹配;grep 如果获取到相应结果,则grep命令的执行结果为0(真),反之则执行结果为1(假);if `命令表达式 &>/dev/null` 时是判断 命令表达式的执行结果是否为真(由于只看执行结果,此时加 &>/dev/null,否则 if 字符串 会报错)
    then
        # \ 表示换行符
        useradd neo$n &>/dev/null && \
        echo $passwd|passwd --stdin neo$n &>/dev/null && \
        echo -e "neo$n\t$passwd" >>/tmp/user.list && \
        action "neo$n added successfully" /bin/true
    else
        action "neo$n exists already" /bin/false
    fi
done
[root@m01 cases]# sh case0303.sh
neo12 exists already                                       [FAILED]
neo13 exists already                                       [FAILED]
neo14 exists already                                       [FAILED]
neo15 exists already                                       [FAILED]
neo16 added successfully                                   [  OK  ]
neo17 added successfully                                   [  OK  ]
[root@m01 cases]# 

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

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

1) ping 命令
[root@m01 ~]# ping -c 2 -i 1 -w 3 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.052 ms

--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1005ms
rtt min/avg/max/mdev = 0.052/0.065/0.079/0.015 ms

ping 命令:
    -c   ping 的次数
    -i   ping 时间间隔(s)
    -w   ping 的总共的时长(s)

2) nmap命令
nmap -sP 10.0.0.0/24


# 方式一: ping
[root@m01 cases]# cat case0401.sh
#!/bin/bash
##############################################################
# File Name: case0401.sh
# Version: V1.0
# Author: neo
# Organization: anonymous
# Created Time : 2019-07-05 00:54:20
# Description:
##############################################################
for n in {1..254}
do
    {
    if `ping -c 1 -w 3 10.0.0.$n &>/dev/null`   # ping 通为true
    then
        echo "10.0.0.$n is up"
    else
        echo "10.0.0.$n is down"
    fi
    } &  # {} & 表示 {} 里面的代码并发执行;此处表示批量 ping
done
[root@m01 cases]# 

# 方式二: nmap
[root@m01 ~]# nmap -sP 10.0.0.0/24

Starting Nmap 5.51 ( http://nmap.org ) at 2019-07-05 01:34 CST
Nmap scan report for 10.0.0.61
Host is up.
Nmap scan report for 10.0.0.253
Host is up (0.0032s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 10.0.0.254
Host is up (0.00081s latency).
MAC Address: 00:50:56:EA:79:FB (VMware)
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.36 seconds
[root@m01 ~]# nmap -sP 10.0.0.0/24|awk '/Nmap scan report for/{print $NF}'      # $NF 表示的最后一个Field(列),即输出最后一个字段的内容
10.0.0.61
10.0.0.253
10.0.0.254
[root@m01 ~]# 

猜你喜欢

转载自www.cnblogs.com/neozheng/p/11131462.html
今日推荐