1. md5sum
在网络传输,设备只见转存,复制大文件等时,可能会出现传输前后数据不一致的情况。这种情况在网络相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的,
md5sum命令用于生成和校验文件的md5值。它会逐位对文件的内容进行校验。是对文件的内容校验,而不是文件名。文件内容相同,其md5值相同。
md5值是一个128位的二进制数据,转换16进制则时32(128/4)位的进制值。
md5校验,有很小概率不同的文件生成md5可能相同,比md5更安全的校验算法还有SHA*系列。
在网络传输时,我们校验源文件获得其md5sum,传输完毕后,校验其目标文件,并对比如果源文件和目标文件md5一致的话,则表示文件传输无异常。否则说明文件在传输过程中未正确传输。
[root@localhost md5sum]# date>date
[root@localhost md5sum]# ls
date
[root@localhost md5sum]# md5sum date
d13a517ea124b71e94da80bd5d28c552 date
[root@localhost md5sum]# md5sum date|cut -d " " -f1
d13a517ea124b71e94da80bd5d28c552
[root@localhost md5sum]# cp date date1
[root@localhost md5sum]# cp date date2
[root@localhost md5sum]# cp date date3
[root@localhost md5sum]# ls
date date1 date2 date3
[root@localhost md5sum]# md5sum *
d13a517ea124b71e94da80bd5d28c552 date
d13a517ea124b71e94da80bd5d28c552 date1
d13a517ea124b71e94da80bd5d28c552 date2
d13a517ea124b71e94da80bd5d28c552 date3
[root@localhost md5sum]# md5sum -b *date1
d13a517ea124b71e94da80bd5d28c552 *date1
[root@localhost md5sum]# md5sum date1
d13a517ea124b71e94da80bd5d28c552 date1
[root@localhost md5sum]# md5sum date
d13a517ea124b71e94da80bd5d28c552 date
将生成的md5sum放到d.md5文件中
[root@localhost md5sum]# md5sum * > d.md5
[root@localhost md5sum]# ls
date date1 date2 date3 date.md5 d.md5
[root@localhost md5sum]# cat d.md5
d13a517ea124b71e94da80bd5d28c552 date
d13a517ea124b71e94da80bd5d28c552 date1
d13a517ea124b71e94da80bd5d28c552 date2
d13a517ea124b71e94da80bd5d28c552 date3
166c75b8d796180611c9d3d5ecc9d858 date.md5
追加文件
[root@localhost md5sum]# md5sum date4>>d.md5
[root@localhost md5sum]# cat d.md5
d13a517ea124b71e94da80bd5d28c552 date
d13a517ea124b71e94da80bd5d28c552 date1
d13a517ea124b71e94da80bd5d28c552 date2
d13a517ea124b71e94da80bd5d28c552 date3
166c75b8d796180611c9d3d5ecc9d858 date.md5
d13a517ea124b71e94da80bd5d28c552 date4
重要的选项
-b 以二进制模式读入文件内容
-t 以文本模式读入文加内容
-c 根据已生成的md5值,对现存文件进香校验
–status 校验完成后,不生成错误或正确的题是信息,可以通过命令的返回值来判断
校验内容
md5sum -c d.md5
md5校验:-c选项来对文件md5进行校验。校验时,根据已生成的md5来进行校验。生成当前文件的md5,并和之前已经生成的md5进行比较,如果一致,则返回OK,否则返回错误信息
[root@localhost md5sum]# cat date
Sat Feb 15 10:00:45 EST 2020
[root@localhost md5sum]# date >> date
[root@localhost md5sum]# cat date
Sat Feb 15 10:00:45 EST 2020
Sat Feb 15 10:13:41 EST 2020
[root@localhost md5sum]# md5sum -c d.md5
date: FAILED
date1: OK
date2: OK
date3: OK
date.md5: OK
date4: OK
md5sum: WARNING: 1 computed checksum did NOT match
# 加上--status没有输出,通过echo $?查看是否有不匹配情况
[root@localhost md5sum]# md5sum -c --status d.md5
[root@localhost md5sum]# echo $?
1
2. Linux系统产生随机数的方法
- 通过系统环境变量($RANDOM)实现
RANDOM的随机数范围为0~32767,因此,加密行布施很好,可以通过在输出的随机数后面增加加密字符串(就是和密码生成有关的一个字符串)的方法解决,最后再一起执行md5sum操作并截取结果的后n位,这样一来,就无法根据随机数范围0~32767来猜出具体结果了。
[root@localhost md5sum]# echo $RANDOM
11962
[root@localhost md5sum]# echo "zjyljl$RANDOM"|md5sum |cut -d " " -f1
68e97b5e6cd59a32b91d0f42b37f0dfc
- 通过openssl产生随机数
令数字与大小写结合,并且带上特殊字符,可以达到很长的位数,这样的随机数很安全。
[root@localhost md5sum]# openssl rand -base64 10 #10byte
LvI6LxeoYt+MFQ==
- 通过date获取随机数
[root@localhost md5sum]# date +%s
1581780775
[root@localhost md5sum]# date +%s%N
1581780782938236310
3. shell脚本随机数实战案例
使用for循环在/westos目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串westos。
[root@localhost md5sum]# cat test.sh
#!/bin/bash
Path=westos
[ -d "$Path" ]||[ mkdir -p $Path ]
for n in `seq 10`
do
random=$(openssl rand -base64 40 | sed 's/[^a-z]//g' |cut -c 2-11)
touch $Path/${random}_westos.html
done
[root@localhost md5sum]# sh test.sh
[root@localhost md5sum]# cd westos/
[root@localhost westos]# ls
edrnynoebq_westos.html ioulybqztn_westos.html xgklufzuht_westos.html
fletgjntbc_westos.html jsowfnsxap_westos.html zgilorbpco_westos.html
hgjocwvxdf_westos.html suxctfbhok_westos.html
hqbvjzgnmb_westos.html wsazgzhkol_westos.html
批量创建10个系统帐号(westos01-westos10).并设置密码(密码位随机数,要求时字符和数字混合)
[root@localhost md5sum]# cat test1.sh
#!/bin/bash
. /etc/init.d/functions
user="westos"
passfile="user.log"
for num in `seq -w 10`
do
pass="`echo $RANDOM|md5sum|cut -c 3-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 # 会清空$passfile文件
[root@localhost md5sum]# sh test1.sh
westos01 is ok [ OK ]
westos02 is ok [ OK ]
westos03 is ok [ OK ]
westos04 is ok [ OK ]
westos05 is ok [ OK ]
westos06 is ok [ OK ]
westos07 is ok [ OK ]
westos08 is ok [ OK ]
westos09 is ok [ OK ]
westos10 is ok [ OK ]
----------------------------
user:westos01 passwd:a27cebe64
user:westos02 passwd:a248a7114
user:westos03 passwd:40fce12bc
user:westos04 passwd:da7940f62
user:westos05 passwd:1e24d1297
user:westos06 passwd:62de26b22
user:westos07 passwd:097739355
user:westos08 passwd:45ab544c9
user:westos09 passwd:2aa2ccf5d
user:westos10 passwd:362eace97
注意:对于给一个数字加0有多种实现方法,这里给出两种方法:seq -w 10;echo {01…10}