Использование Sed для обновления файла GRUB

Я новичок в использовании sed, но быстро учусь любить его за его универсальность в автоматизации. Я рассчитываю запускать сценарий с различными элементами управления безопасностью каждый раз, когда развертываю новую систему, и для этого требуется, чтобы я заблокировал GRUB. Я хочу разблокировать общий параметр Ubuntu из меню GRUB, чтобы каждый мог использовать его после этого без пароля, сохраняя при этом все остальные паролями защищенными.

С учетом вышесказанного я ищу в файле /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' {

И я хочу, чтобы она выглядела так: [ 115]

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-simple-2aa7ed2c-67a7-42d5-84fb-0ddab74c5dd0' {

Я знаю, что sed -i предназначен для редактирования на месте, и он должен искать. Но помимо этого я теряюсь в синтаксисе, чтобы он действительно делал то, что нам нужно. Насколько я могу судить, позиционирование --unrestricted необходимо, так как я считаю, что было бы проще, если бы нам не пришлось проводить такой долгий поиск, но, опять же, я новичок в sed и не уверен. Может ли кто-нибудь помочь мне с этой вставкой sed? Желательно также объяснить мне, почему другой синтаксис идет туда, где он есть, поэтому я знаю на будущее.

4
задан 30 April 2019 в 18:03

3 ответа

Вот команда.

sed -i "s/--class os/--class os --unrestricted/" filename

Это заменит строку в файле, не требуя временного файла, из-за опции -i.

Если не имеет значения, где в строке идет «--unrestricted», это может быть проще.

sed -i "s/'Ubuntu'/'Ubuntu' --unrestricted/" filename
0
ответ дан 30 April 2019 в 18:03

Мой ответ похож на ответ RaidPinata:

sudo sed -i s'/--class os \$menu/--class os --unrestricted \$menu/' /etc/default/grub

"\ $" экранирует символ "$", так что он не интерпретируется неправильно, и я указываю более длинную строку, так что если команда выполняется дважды, вы не получите вставку дважды.

0
ответ дан 30 April 2019 в 18:03

Как упомянул @oldfred в своем комментарии. Мой ответ: НЕ ДЕЛАЙТЕ ЭТОГО.

Я не профессионал, но я уверен, что каждый раз, когда обновляется ядро, ваш grub обновляется, и любые изменения в /boot/grub/grub.cfg будут перезаписываться.

Скорее всего, вы захотите создать собственную запись Grub, а также, если вас интересует безопасность, эта статья хорошо читается и имеет лучшие варианты.

https://help.ubuntu.com/community/Grub2/Passwords

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
}
0
ответ дан 30 April 2019 в 18:03

Другие вопросы по тегам:

Похожие вопросы: