Answers:
random="$(dd if=/dev/urandom bs=3 count=1)"
It treats the output of a command like a variable.
您实际上是指字符串,对吗?
$()
非常通用,而不是特定于bash。顺便说一句,请注意不要对shell可以存储在变量中的字符施加任何限制-例如,我测试过的bash版本从字符串中省略了null(\ x00)。
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
(如果要使用文字破折号,则破折号必须像上述那样放在字符串的末尾,而不是*-_
)。
并解释由于上述命令而完成的操作:
head -c 500 /dev/urandom
:从中获取前500个字符(字节)/dev/urandom
。tr -dc 'a-zA-Z0-9~!@#$%^&*_-'
:从第一个命令的输出中除去除指定的字符外的所有字符'a-zA-Z0-9~!@#$%^&*_-'
。fold -w 3
:格式化第二个命令的输出,使其每行包含3个字符。 head -n 1
:在上显示第三条命令的结果的第一行stdout
。fold -w 3 | head -n 1
a 代替a 来进一步简化head -c 3
。
Illegal byte sequence
错误。要解决此问题,请使用“ C”编码;将命令更改为:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
请检查man od
。
您可以使用,例如
od -vAn -N4 -tu4 < /dev/urandom
生成无符号十进制4字节随机数。
这是一个创建base64字符串的示例,请注意,即使它们仅限于base64字符串,也会从其中删除填充,因此您无法对其进行解码,无论如何您可能都不需要它。
cat /dev/urandom | base64 | head -c 5
替换5
为您想要的字符数。
但是,如果由于某种原因需要解码它们,请移至base64
管道的末尾。然后它将从urandom收集5个字符,并使用正确的填充对base64进行编码,但是由于填充,最终字符串可能会比您想要的更长。
cat /dev/urandom | head -c 5 | base64
cat
将读取的N
字符数远远超过给定数量的字符,并且会耗尽熵。没有用的答案。
cat
因为这两者都是一种滥用,base64
并且head
可以将文件名作为参数,但是在这种情况下,它是可行的,不应消耗熵。参见stackoverflow.com/questions/10031344/…–
尝试这个: dd if=/dev/urandom bs=1 count=3
如果要将结果放入$ variable中:
variable=`dd if=/dev/urandom bs=1 count=3`
请注意,它可能无法打印。
$()
工作?