Nil*_*ner 17 security bash password
我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
但是我担心将新密码作为命令行参数传递给echo,因为其他用户通常可以看到参数ps -aux(尽管我从未看到任何echo行出现在ps)。
是否有另一种方法可以为我返回的密码添加一个值,然后将其传递给chpasswd?
Kus*_*nda 15
您的代码应该是安全的,echo因为它是内置的 shell,所以不会出现在进程表中。
这是一个替代解决方案:
#!/bin/bash
n=20
paste -d : <( seq -f 'student%.0f' 1 "$n" ) \
<( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd
Run Code Online (Sandbox Code Playgroud)
这将创建您的学生姓名和密码,n而无需在任何命令的任何命令行上传递任何密码。
该paste实用程序将几个文件粘合在一起作为列,并在它们之间插入一个分隔符。在这里,我们使用:作为分隔符并给它两个“文件”(进程替换)。第一个包含seq创建 20 个学生用户名的命令的输出,第二个包含创建 20 个长度为 13 的随机字符串的管道的输出。
如果您有一个已生成用户名的文件:
#!/bin/bash
n=$(wc -l <usernames.txt)
paste -d : usernames.txt \
<( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd
Run Code Online (Sandbox Code Playgroud)
这些会将密码和用户名保存到文件中,secret.txt而不是在终端中显示生成的密码。
echo很可能内置在 shell 中,因此它不会ps作为单独的进程出现。
但是您不需要使用命令替换,您只需将管道的输出直接发送到chpasswd:
{ printf "%s:" "$username";
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
} | chpasswd
Run Code Online (Sandbox Code Playgroud)
如果您想通过一次运行更改多个密码,chpasswd重复基本部分应该很容易。或者把它变成一个函数:
genpws() {
for user in "$@"; do
printf "%s:" "$user";
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13
echo
done
}
genpws username1 username2... | chpasswd
Run Code Online (Sandbox Code Playgroud)
顺便说head /dev/urandom一句:这感觉有点奇怪,因为urandom不是面向行的。它可能会从中读取过多的字节,这将影响内核的可用熵概念,进而可能导致/dev/random阻塞。仅读取固定数量的数据并使用类似的base64方法将随机字节转换为可打印字符(而不是仅仅丢弃大约 3/4 的字节)可能会更清晰。
像这样的东西会给你大约。16 个字符和数字:
head -c 12 /dev/urandom | base64 | tr -dc A-Za-z0-9
Run Code Online (Sandbox Code Playgroud)
(也就是说,输出中+和/字符的数量减少了 16 个base64。每个字符的概率为 1/32,所以如果我的组合算正确,那么大约有 99% 的机会留下至少 14 个字符,并且有 99.99% 的机会离开至少 12 个。)
| 归档时间: |
|
| 查看次数: |
2517 次 |
| 最近记录: |