shell随机数的产生

上一篇 / 下一篇  2012-05-05 15:01:42 / 个人分类:Shell学习

随机数常用的四种方法

第一种方法、使用shell变量$RANDOM
echo $RANDOM 生成的是整数随机数 范围为: 0 - 32767 (带符号的16位整数).
这个是最为调用的方式。使用BASH内置的$RANDOM函数。(奇怪的是我是用#!/bin/sh 却不能调用)
复杂的随机数生成脚本 ------------------------------------------------------------------------------------
MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef ghijklmnopqrstuvwxyz~!@#$%^&*()_+="
LENGTH="9"
while [ "${n:=1}" -le "$LENGTH" ]
do
PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
let n+=1
done
echo "$PASS"
exit 0
--------------------------------------------------------------------------------------
[[ $# != 1 || $1 > 50 ]]&&{ echo "Usage ${0##/*} num";exit 1; }
array=(a b c d e f g h i j k l m n o p q r s t u v /
w x y z A B C D E F G H I J K L M N O P Q R S T U V/
W X Y Z 0 1 2 3 4 5 6 7 8 9)
dodo(){
echo -n ${array[$((RANDOM%${#array[@]}))]}
}
i=1
n=$1
while((i<=n));do
dodo
((i++))
done 2>/dev/null
echo
--------------------------------------------------------------------------------------

第二种方法、使用awk的随机函数
awk 'BEGIN{srand();print rand()}'

第三种方法、使用系统设备文件/dev/random 和 /dev/urandom
ddif=/dev/random | od -a |sed's/[^ ]*//;s/ //g' | head -3
dd if=/dev/urandom | od -a |sed 's/[^ ]*//;s/ //g' | head -3
/dev/random 提供优质随机数。
/dev/urandom提供伪随机数。速度更快、安全性较差的随机数发生器。

例如:echo $((16#`dd if=/dev/urandom bs=1 count=4 2>/dev/null| od -A n -t x4|sed s/[^1-9a-fA-F]//g`))%1024|bc

分开来看:
echo $((16#ABC))  意思是将十六进制数ABC转换成十进制数
`command` 意思是两个`中间的命令执行结果做为外壳命令的参数
/dev/urandom 是个生成随机数的设备,比/dev/random稍不安全,但产生速度极快
dd if=/dev/urndom bs=1 count=4 从随机数设备中取前4个字节(32位数)
2>/dev/null 意思是将错误信息重定向到空设备中
od -A n -t x4 意思是将dd过来的数据(一个随机的32位值)进行转换输出,-A n是不输出偏移标志,-t x4是将数字用16进制输出,并且4个字节一组,这样就以16进制输出一个32位的数
sed s/[^1-9a-fA-F]//g 意思是去年输出文件中非十六进制可接受的字符(此例中主要是删除行前的空格,也可以用tr-d ' ' 或 awk '{print $1}'处理)
1024|bc 生成特定运算结果 生成0-1023范围内的随机数

----------------------------------------------------------------
cut命令的使用
cut -d: -f 1 /etc/passwd> /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段
-----------------------------------------------------------------
我最后选用这种方法实现16和8位的密码集【A-Za-z0-9】之间的随机字符
bit(){
while [ ! $1 = ${#BIT} ]
do
BIT=`dd if=/dev/urandom | od -a |sed 's/[^1-9a-fA-F]//g' | head -1 | cut -c-$1`
done
return
}
在bit 8;$BIT; bit 16 ;$BIT; 来获得16位及8位的密码
-----------------------------------------------------------------

第四种方法、date命令生成的纳秒数作为随机数
date --rfc-3339=ns|sed -n "s/.*/.0*/(.*/)+.*//1/p"
命令也可以用:
date --rfc-3339=ns|sed "s//.0*/|+//n/g"|sed -e 1d -e 3d

date --rfc-3339=ns|awk -F "[ /t.+]" '{printf("%d/n",$3)}'
不太熟悉,没有使用过上面的方法。

TAG:

abinNO1的个人空间 引用 删除 abinNO1   /   2013-04-18 20:21:56
设置文件锁防止同时运行:
lockfile=$(pwd)/.lockfile
{
        flock -n 4
        [ $? -eq 1 ] && { echo "the script is running ,and it has been locked"; exit; }
        sleep 5
        echo $$ > $lockfile
        cat $lockfile

} 4<>$lockfile
abinNO1的个人空间 引用 删除 abinNO1   /   2013-04-18 20:17:59
将密码转换成“*”:
function getchar {
        stty cbreak -echo
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -cbreak echo
}
echo -ne '\e[6n';read -sdR pos
pos=${pos#*[}
row=$(echo $pos|awk -F ';' '{print $1-1}')
col=$(echo $pos|awk -F ';' '{print $2-1}')
tput cup $row $col
echo -n -e  "please input password:"
CURPOS=21
while true
do
        CURPOS=`expr ${CURPOS} + 1`
        char=$(getchar)
        tput cup $row ${CURPOS}
        if [ -z "$char" ]
        then
                break
        else
                PWDSTR=${PWDSTR}${char}
        fi
        echo -n "*"
done
echo -e "\nyour password: ${PWDSTR}"
abinNO1的个人空间 引用 删除 abinNO1   /   2013-04-18 20:05:01
对字符串进行加密:
#!/bin/bash
if [ "$1" = "-d" ];then
        echo "$2" |base64 -d|awk '{print $1}'   //解密操作
else
        echo "$1 asdfqwer"|base64            //加密操作
fi
abinNO1的个人空间 引用 删除 abinNO1   /   2012-11-01 16:08:50
http://www.csdn.net/article/2012-03-19/313229
写出健壮的shell
abinNO1的个人空间 引用 删除 abinNO1   /   2012-06-20 18:31:36
https://www.ibm.com/developerworks/cn/linux/
python调试
abinNO1的个人空间 引用 删除 abinNO1   /   2012-06-20 09:35:18
http://www.cnblogs.com/bangerlee/archive/2012/06/04/2532674.html
linux服务器被hacker
abinNO1的个人空间 引用 删除 abinNO1   /   2012-05-26 18:29:12
http://phorum.study-area.org/index.php?topic=66622.0
esxi5经验与测试
abinNO1的个人空间 引用 删除 abinNO1   /   2012-05-26 17:58:20
http://www.searchvirtual.com.cn/guide/vsphere5esxi5.htm#log
esxi5 教程
 

评分:0

我来说两句

Open Toolbar