我是 sed 的新手,但很快就爱上了它的自动化灵活性。每次部署新系统时,我都希望运行一个带有各种安全控制的脚本,其中一部分需要我锁定 GRUB。我希望从 GRUB 菜单解锁常规 Ubuntu 选项,以便任何人都可以在没有密码的情况下使用它,同时保持其他所有内容都受到密码保护。
话虽如此,我希望在 /boot/grub/grub.cfg 文件中搜索特定行,并将 --unrestricted 添加到该选项。(我们只使用 16.04.03,因此理论上所有系统在安装时都会有相同的文件)
文件中的行如下:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-2aa7ed2c-67a7-42d5-84fb-0ddab74c5dd0' {
我希望它看起来像:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-simple-2aa7ed2c-67a7-42d5-84fb-0ddab74c5dd0' {
我知道 sed -i 用于就地编辑,而 s/ 应该用于搜索。但除此之外,我不知道这里的语法如何才能真正满足我们的需要。据我所知,需要定位 --unrestricted,因为我相信如果我们不必进行如此长时间的搜索,它会更容易,但我还是 sed 新手,不确定。有人能帮我插入这个 sed 吗?最好还能向我解释为什么不同的语法会出现在它出现的位置,这样我以后就知道了。
答案1
我的回答与 RaidPinata 的类似:
sudo sed -i s'/--class os \$menu/--class os --unrestricted \$menu/' /etc/default/grub
“\$” 转义“$”符号,以便它不会被错误解释,并且我指定了一个更长的字符串,以便如果命令执行两次,您就不会插入两次。
答案2
这是命令。
sed -i "s/--class os/--class os --unrestricted/" filename
由于 -i 选项,这将替换文件中的行而不需要临时文件。
如果“--unrestricted”在行中的位置无关紧要,这可能会更简单。
sed -i "s/'Ubuntu'/'Ubuntu' --unrestricted/" filename
答案3
正如@oldfred 在他的评论中提到的那样。我的答案是,不要这样做。
我不是专业人士,但我相当确定每次更新内核时你的 grub 也会更新,并且任何更改都/boot/grub/grub.cfg
将被覆盖。
您可能想要创建一个自定义的 Grub 条目,并且如果您担心安全性,那么这篇文章似乎很值得一读并且有更好的选择。
https://help.ubuntu.com/community/Grub2/密码
https://help.ubuntu.com/community/Grub2/Passwords#Protecting_Menuentries
注意:“另一种选择是创建自定义菜单,添加您想要的菜单项(包括您想要保护的菜单项),然后禁用标准脚本。用户和密码可以包含在此文件中,而不是 00_header 文件中。这可能是一种更简单的分配密码保护的方法 - 特别是如果只有部分菜单项需要保护。”
这就是我向 Grub2 添加自定义菜单项的方式,但我从未为现有操作系统创建过自定义条目,因此我将其留给您去研究。
sudo nano /etc/grub.d/40_custom && sudo update-grub2
menuentry "Ubuntu ISO" {
set isofile="/home/isos/ubuntu.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject toram
initrd (loop)/casper/initrd.lz
}