我正在尝试使用chpasswd
. 密码应该随机生成并打印到stdout
(我需要将它们写下来或将它们放在密码存储中),并且还传递到chpasswd
.
天真地,我会这样做
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
但是我担心将新密码作为命令行参数传递给echo
,因为参数通常对其他用户可见ps -aux
(尽管我从未看到任何echo
行出现在ps
)。
有没有另一种方法可以在我返回的密码前面加上一个值,然后将其传递给chpasswd
?
您的代码应该是安全的,
echo
因为它是内置的 shell,因此不会出现在进程表中。这是一个替代解决方案:
这将创建您的学生姓名和密码,
n
而无需在任何命令的任何命令行上传递任何密码。该
paste
实用程序将多个文件作为列粘合在一起,并在它们之间插入一个分隔符。在这里,我们使用:
它作为分隔符并给它两个“文件”(进程替换)。第一个包含seq
创建 20 个学生用户名的命令的输出,第二个包含创建 20 个长度为 13 的随机字符串的管道的输出。如果您有一个已生成用户名的文件:
这些会将密码和用户名保存到文件
secret.txt
中,而不是在终端中显示生成的密码。echo
很可能是内置在 shell 中的,所以它不会ps
作为一个单独的进程出现。但是您不需要使用命令替换,您可以将管道的输出直接发送到
chpasswd
:如果您想一次更改多个密码,
chpasswd
重复基本部分应该很容易。或者把它变成一个函数:顺便说一句:这
head /dev/urandom
感觉有点奇怪,因为urandom
它不是面向行的。它可能会从中读取过多的字节,这将影响内核的可用熵概念,进而可能导致/dev/random
阻塞。仅读取固定数量的数据并使用诸如将随机字节转换为可打印字符之类的方法可能会更干净base64
(而不是仅仅丢弃大约 3/4 的字节)。像这样的东西会给你大约。16 个字符和数字:
(也就是说,输出中的
+
和/
字符的数量少 16 个base64
。其中一个的机会是每个字符 1/32,所以如果我的组合正确,那么大约有 99% 的机会留下至少 14 个字符,并且99.99 % 的机会离开至少 12 个。)