我正在尝试以编程方式生成用户名和密码,然后对密码进行哈希处理并将其存储在grub配置文件中
我目前有这个
# add a superuser account and password for the bootloader
## generate a secure password
pw=$(openssl rand -base64 32)
## create the new user for the bootloader and set the password as the secure password
useradd grub2superuseraccount
echo $pw | passwd grub2superuseraccount --stdin
## store the password to a TEMP file (needed to pass the password to grub2_mkpassword-pbkdf command, it will be deleted after)
cat << END >> ~/pfile
$pw
$pw
END
## generate the password hash and store it in the bootloader config file
cat ~/pfile | grub2-mkpasswd-pbkdf2 | sed -i "/password_pbkdf2/a password_pbkdf2 $THEVALUEOFTHEOUTPUTFROMTHEPIPE"
## delete the file with the password
rm ~/pfile
如何将'grub2-mkpasswd-pbkdf2'的哈希密码输出传递给sed命令?
OR
如果还有另一种方法可以更优雅地做到这一点,那我将如何去做呢?
答案 0 :(得分:1)
这是一个重构,它也避免了讨厌的临时文件。
pw=$(openssl rand -base64 32)
useradd grub2superuseraccount
# Notice proper quoting
echo "$pw" | passwd grub2superuseraccount --stdin
# Collect output into a variable
grubpw=$(printf '%s\n' "$pw" "$pw" | grub2-mkpasswd-pbkdf2)
# Use the variable in sed -i
sed -i "/password_pbkdf2/a password_pbkdf2 $grubpw" conffile
您的问题并没有指出conffile
的名称,因此显然要用您实际要在其上运行sed -i
的文件的名称替换它。
如果grub2-mkpasswd-pdkdf2
的输出可能包含换行符或其他有问题的字符,则可以在变量中添加一些转义。
如果您确实确实需要使用管道,则可以考虑使用xargs
。
printf '%s\n' "$pw" "$pw" |
grub2-mkpasswd-pbkdf2 |
xargs -i sed -i "/password_pbkdf2/a password_pbkdf2 {}" conffile
答案 1 :(得分:0)
您可以使用GNU / Bash read
来满足您的需求,例如:
cat ~/pfile | grub2-mkpasswd-pbkdf2 | (read THEVALUEOFTHEOUTPUTFROMTHEPIPE && sed -i "/password_pbkdf2/a password_pbkdf2 $THEVALUEOFTHEOUTPUTFROMTHEPIPE")
答案 2 :(得分:0)
如何将'grub2-mkpasswd-pbkdf2'的哈希密码输出传递给sed命令?
通过命令替换,不需要管道:
sed -i "/password_pbkdf2/c password_pbkdf2 $(grub2-mkpasswd-pbkdf2 < ~/pfile)" your_grub.conf
请注意,我稍微更改了sed
命令,将c
更改为 c ,将整行挂在命令后面,而不是a
,将< strong> a 添加了一条全新的线。