string - 如何仅使用符合 POSIX 的 shell 工具生成字母数字字符串?
问题描述
我正在尝试使用符合 POSIX 的 shell 工具生成一个八字符的字母数字字符串。我正在尝试使用 /dev/urandom 来生成这个字符串(顺便说一下,我不知道 /dev/random 和 /dev/urandom 不是由 POSIX 指定的,但我会使用它,因为它们存在于 Linux 上, FreeBSD、Mac OS、AIX 等)
有很多指南展示了如何做到这一点,但我发现没有一个指南接近正确。特别是,我一直看到 head -c 的使用(POSIX 中未定义 -c 参数),如下所示:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
我担心的另一个问题是,我见过的几乎所有解决方案都不尊重字节流和字符流之间的区别,这让我担心我正在生成不安全的字符串。
这是我能想到的最好的,但我并不完全理解:
strings -n 1 < /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1
它符合 POSIX(减去 /dev/urandom),但我是否正确地达到了目的?如果是这样,是否有更好的方法来实现这一目标?如果有一种方法可以在没有 /dev/urandom 的情况下生成随机字符串,那也会很酷,但我想我正在做梦。
解决方案
只需使用awk
POSIX 授权提供的rand
功能。
$ cat password.awk
BEGIN {
srand();
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
s = "";
for(i=0;i<8;i++) {
s = s "" substr(chars, int(rand()*62), 1);
}
print s
}
$ awk -f password.awk
Cl7A4KVx
(几乎可以肯定,这可以用代码编写成更短的代码;我的awk
技能有些有限。)
如果您需要多个密码,请将所需的数字作为参数传递,这样您就不需要awk
每秒运行超过一次:
BEGIN {
srand();
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
for(i=0;i<n;i++) {
s = "";
for(j=0;j<8;j++) {
s = s "" substr(chars, int(rand()*62), 1);
}
print s
}
}
要传递 的值n
,请运行 asawk -v n=5 -f password.awk
以生成 5 个密码。
或者,您可以将不同的种子直接传递给awk
:
BEGIN {
srand(seed);
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
s = "";
for(i=0;i<8;i++) {
s = s "" substr(chars, int(rand()*62), 1);
}
print s
}
与awk -v seed=$newseed -f password.akw
. 请注意,newseed
它本身每次都需要有不同的值,但使用简单的种子顺序序列就足够了。
seed=$(date +%s)
awk -v seed=$seed -f password.awk; seed=$((seed + 1))
awk -v seed=$seed -f password.awk; seed=$((seed + 1))
awk -v seed=$seed -f password.awk; seed=$((seed + 1))
# etc
推荐阅读
- javascript - 使用自定义数据类型调用 ngModel 作为接口
- python - scikit-learn MinMax 缩放器无法缩放
- java - Jsoup如何检查一个元素是否有特定的子元素
- c# - 使用 Raycasts.TextureCoord 在 3d 对象上绘制 - 不绘制
- python - 有没有办法动态创建跟踪,例如堆叠条形图?
- php - Stripe 为费用创建发票/发票
- string - 如何从嵌套列表中删除一定长度的字符串?
- reactjs - 将我的 ReactJS Web 客户端直接连接到 DialogFlow
- django - Django Angular 403 Django 不接受 CSRF-cookie:“CSRF 令牌丢失或不正确。”
- python - django 在模型字段访问之前运行代码?(代理模型字段)