sed的管道值,并在替换字符串中使用它

时间:2019-02-13 08:11:00

标签: bash awk sed centos

我正在尝试以编程方式生成用户名和密码,然后对密码进行哈希处理并将其存储在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

如果还有另一种方法可以更优雅地做到这一点,那我将如何去做呢?

3 个答案:

答案 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 添加了一条全新的线。