Sed Uso para atualizar o arquivo GRUB

4

Eu sou novo no uso do sed, mas aprendendo rapidamente a amá-lo por sua flexibilidade geral em automação. Estou procurando executar um script com vários controles de segurança toda vez que implanto um novo sistema, e parte disso exige que eu bloqueie o GRUB. Eu estou procurando desbloquear a opção geral do Ubuntu no menu GRUB, para que qualquer pessoa possa usá-lo depois disso sem uma senha, mantendo todo o resto protegido por senha.

Dito isto, estou procurando pesquisar no arquivo /boot/grub/grub.cfg uma linha específica e adicionar --unrestricted a essa opção. (Nós usamos apenas 16.04.03 para que todos os sistemas tenham teoricamente o mesmo arquivo na instalação)

A linha no arquivo é:

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

E eu quero que fique assim:

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

Eu sei que sed -i é para edição no local e deve ser pesquisado. Mas além disso, estou perdido na sintaxe aqui para fazê-lo realmente fazer o que precisamos. Até onde eu sei, esse posicionamento de --unrestricted é necessário, pois acredito que seria mais fácil se não tivéssemos que fazer uma pesquisa tão longa, mas novamente sou novo em sed e inseguro. Alguém poderia me ajudar com essa inserção sed? De preferência, também me explique por que a sintaxe diferente vai aonde ela é, então eu sei para o futuro.

Brendan77222
fonte
2
você não deve editar /boot/grub/grub.cfg. Ele será substituído por todo sudo update-grub que será executado automaticamente pelas atualizações do kernel ou pelo grub. Provavelmente é melhor desativar a maioria dos scripts grub e criar sua própria entrada no 40_custom exatamente como você deseja. Você só precisa de 00_header e 05_debian-theme e um personalizado 40_custom com as entradas desejadas.
oldfred 30/04
Você tem um link para isso em algum lugar? Eu devo ter encontrado algo para uma versão mais antiga ou algo assim. Eu quero saber como fazê-lo corretamente.
Brendan77222 30/04
1
Você pode repensar sua estratégia de implantação. Eu não gostaria de executar esta linha em cada servidor, mas talvez crie as configurações de trabalho em um servidor de arquivos remoto e peça a cada servidor que as puxe após a instalação executando um post-install.shscript. Dessa forma, você pode adicionar / editar mais scripts no futuro e apenas executar novamente o script de instalação. Apenas um pensamento ...
FreeSoftwareServers
1
Esse é um plano em que estamos trabalhando para o futuro, mas, como está, não temos um servidor sobressalente que possamos usar para o nosso departamento no momento. No futuro, estamos buscando soluções exatamente dessa natureza, obrigado pela sugestão!
Brendan77222
1
Sim, tudo depende do tamanho do seu sistema, eu costumava gerenciar uma pequena quantidade de servidores dessa maneira, mas quando esse número aumentou, eu usei o Jenkins para implantar coisas que não são o seu principal objetivo, mas funcionou muito bem
FreeSoftwareServers

Respostas:

2

Aqui está o comando.

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

Isso substituirá a linha no arquivo sem a necessidade de um arquivo temporário, devido à opção -i.

Se não importa para onde a linha "- irrestrita vai", isso pode ser mais simples.

sed -i "s/'Ubuntu'/'Ubuntu' --unrestricted/" filename
RaidPinata
fonte
1
Existem quase certamente soluções mais elegantes do que as que usei aqui, mas essa é uma boa abordagem no estilo iniciante para o uso do sed para resolver problemas como esse. Se houver outras linhas no arquivo que contenham "--class os", será necessário expandir o sed para incluir uma parte exclusiva dessa linha.
RaidPinata 30/04
Definitivamente ótimo, obrigado. então, quando pesquisarmos com sed, ele substituirá o que procuramos sempre? Então, precisamos incluir também o que procuramos no txt inserido? Isso é outra coisa que eu não sabia dos cinco artigos que li.
Brendan77222 30/04
1
Brendan, existem maneiras de procurar por strings, mas não substituí-las no regex. Eles são chamados grupos look-ahead ou look-behind. No entanto, eles são um pouco mais complicados. No entanto, eles não funcionam com o sed.
RaidPinata 30/04
Além disso, apenas o testei em um arquivo aleatório da área de trabalho com a linha de texto acima e funcionou perfeitamente, obrigado. Marcado como resposta desde que você foi o primeiro, apesar de Charles também ter sido útil.
Brendan77222 30/04
6

Minha resposta é semelhante à do RaidPinata:

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

o "\ $" escapa do símbolo "$" para que não seja mal interpretado e estou especificando uma string mais longa para que, se o comando for executado duas vezes, você não obtenha a inserção duas vezes.

Charles Green
fonte
O RaidPinata usou aspas duplas e você usou aspas simples, isso importa aqui?
Brendan77222 30/04
2
O @ Brendan77222 sedpermite que você defina os delimitadores iniciando e finalizando o comando 's' em tempo real - o RaidPinata usou "/ e eu usei '/ ... Existem algumas diferenças no comportamento usando" em vez de ". Temo que ainda esteja aprendendo, então não vou ajudar muito nisso!
Charles Green
Obrigado por isso, bem como o exemplo de como expandi-lo. Definitivamente vou precisar e aprender um novo personagem de fuga me ajudará com esse avanço. Eu acredito que precisarei expandir para frente, em vez de depois, devido às linhas no arquivo serem mais semelhantes após --class os. Mas isso me mostrou exatamente o que significava, obrigado.
Brendan77222 30/04
2
@ Brendan77222 Aqui está um tutorial decente sobre citações e meta-caracteres https://www.grymoire.com/Unix/Quote.html
Charles Green
1
@ Brendan77222 - sim, foi o que fiz no segundo comando na minha resposta. É a maneira mais simples de procurar algo com aspas simples para usar aspas duplas como delimitador externo.
RaidPinata 30/04
2

Como @oldfred menciona em seu comentário. Minha resposta é: NÃO FAÇA ISSO.

Não sou profissional, mas tenho certeza de que toda vez que o kernel é atualizado, seu grub é atualizado e quaisquer alterações /boot/grub/grub.cfgserão substituídas.

Você provavelmente criará uma entrada Grub personalizada e também se a segurança for sua preocupação, este artigo parece ser uma boa leitura e tem melhores opções.

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

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

Nota: "Outra opção é criar um menu personalizado, adicionar os itens de menu que você deseja (incluindo aqueles que deseja proteger) e desativar os scripts padrão. Os usuários e senhas podem ser incluídos neste arquivo e não no arquivo 00_header. Esse pode ser um método mais fácil de atribuir proteção por senha - especialmente se apenas alguns dos itens de menu estiverem protegidos ".

É assim que eu adicionaria uma entrada de menu personalizada ao Grub2, mas nunca fiz uma entrada personalizada para o sistema operacional existente, então deixo isso para você pesquisar.

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
}
FreeSoftwareServers
fonte
Mudei para editar o arquivo adequado que o manterá atualizado sempre. Fico feliz que ele apontou. Obrigado pelos links impressionantes!
Brendan77222