shell如何生成随机字符串 shell随机密码工具mkpasswd用法

发布时间:2020-12-20编辑:脚本学堂
shell怎么生成随机字符串,shell生成随机密码的方法与例子,在shell中生成指定范围的随机字符串,并介绍了linux下一个密码生成器的小工具mkpasswd的用法。

一、shell生成随机字符串,并替换已有字符串。

代码:
 

复制代码 代码示例:
#!/bin/bash
# use random string replace authkey
authkey=
for ((i = 0; i < 15; i++)); do
    tmpkey=`cat /dev/urandom | sed 's/[^a-zA-Z0-9]//g' | strings -n 2 | head -1`
    authkey=${authkey}${tmpkey}
done
# echo $authkey
# Bn3cBQMjcsKLcH7HZNB8P27IPFkWDQuAj1Dfqxjq
sed -i "s#'authkey' => '(.*)'#'authkey' => '$authkey'#g" ./config.php

借助于 /dev/urandom 这个 unix 系统提供的产生随机数的设备。

使用了多次循环得到相应长度的字符串,主要是因为在 /dev/urandom 设备中。
若要使用 strings 输出较长的可打印字符串会消耗较长时间(可以 cat /dev/urandom 看下,注意 Ctrl + C ),所以想到了用多次循环获得短字符串然后拼接起来的方法,:)

这里推荐一个shell生成随机密码的小例子,查看:linux中生成随机密码的shell脚本

二、shell生成随机字符串

功能
用于系统初始密码,字符串由字母大小写外加数字组成。

cat make_passwd.sh
 

复制代码 代码示例:
#!/bin/bash
#script_name:make_passwd.sh
#echo random password
#
 
head -c 100 /dev/urandom | tr -dc a-z0-9A-Z | head -c 15;echo

案例:
用shell生成随机密码

比如产生一个8位的字母和数字混合的随机密码,可以这样:
 

[linux@test /tmp]$ cat /dev/urandom | head -1 | md5sum | head -c 8
6baf9282

只要修改最后面的”head -c 8″就可以产生你想要的随机密码了(最多可以生产32位,用做密码足够了:)

shell随机字符串应用最多的地方是:用于生成随机用户密码。

例子:生成一个8位的随机密码:
 

[linux@test /tmp]$ od -N 4 -t x4 /dev/random | head -1 | awk ‘{print $2}’

这里推荐一个好用的随机密码生成工个:mkpasswd。

延伸:
mkpasswd随机密码工具安装方法

linux下有一个密码生成器的小工具(mkpasswd,需要装一个软件包:expect-5.43.0-5.1.src.rpm),可以根据需要随机生成各种各样的密码:
 

mkpasswd -l 10 -d 3(密码长度为10个字符,其中含有3个数字)

生成单个密码时,只要运行这个命令就可以。

如果是多个用户的密码,可以写成shell脚本的形式来生成密码。

例1:
 

复制代码 代码示例:
#!/bin/bash
for i in seq 1 11;
do
mkpasswd
done

shell脚本:
 

复制代码 代码示例:
[root@10.10.90.97 ~!]# more password.sh
#!/bin/bash
array=( ^ % * # @ ( ) ] [ ! $ % _ + = ~ , : ; ' " |
a b c d e f g h i j k m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J K L M N P Q R S T U V W X Y Z)
mun=echo ${#array[@]}
mininum=8
maxinum=expr 8 + $((RANDOM%3))
for i in seq 1 $maxinum;do
echo -n "${array[$((RANDOM%${mun}))]}"
done
echo

例2,perl写的随机密码生成工具,用perl来实现makepassword随机密码工具。

代码:
 

复制代码 代码示例:
[root@10.10.90.97  ~]# more passwd.pl
#!/usr/bin/perl
my $characterset = 'abcdefghijkmnopqrstuvwxyz23456789ABCDEFGHIJKLMNPQRSTUVWXYZ';
$characterset .= "!@#$%^*()_=-~,.?;:|";
my $mininum = 8;
my $maxinum = 10;
sub MakePassword
{
my ($composition, $lowlength, $highlength) = @_;
return '' unless $composition;
my @p = split //, $composition;
my $arraylength = @p;
$lowlength = 7 if $lowlength < 1;
$highlength =7 if $highlength < 1;
if ($lowlength > $highlength) {
($highlength, $lowlength) = ($lowlength, $highlength);
}
my $length = int(rand($highlength - $lowlength + 1));
$length += $lowlength;
my $password = '';
for (1..$length) {
my $i = int(rand($arraylength));
$password .= $p[$i];
}
return $password;
}
my $password = MakePassword ($characterset, $mininum, $maxinum);
print $password;

例子:
 

复制代码 代码示例:
#! /bin/bash
getrandomkey() {
a=(0 1 2 3 4 5 6 7 8 9 a b c d A B C D @ %)
for ((i=0;i<$1;i++));do
echo -n ${a[$RANDOM % ${#a[*]}]}
done
}
key=getrandomkey expr $RANDOM % 20 + 30`