pt - não anexa a nova linha EOF e substitui a letra não definida

1

Estou experimentando um comportamento estranho usando um comando sed (tenho que ser sed, no awk, neste caso) e tenho duas perguntas para você, esperando que alguém tenha as habilidades para me explicar o que estou fazendo de errado.

  • Eu quero acrescentar um comentário e dois comandos ao / etc / sudoers usando o seguinte one-liner:

    sed -i -e '$a\# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\n\apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\n\Defaults:apache !requiretty' /etc/sudoers
    

    Strage coisas acontecendo aqui:

    • A primeira linha (um comentário) é acrescentada no final do arquivo diretamente sem uma linha vazia criada (apenas uma "coisa de design" que eu gostaria de corrigir)
    • A segunda linha criada começa agora com ^ Gpache em vez de apache

Perguntas:
1. Como posso acrescentar uma linha vazia usando o meu sed-liner no final do arquivo e depois inserir meu texto depois dessa linha vazia?
2. O que eu preciso corrigir no meu one-liner para ter sed adicionar o texto que eu quero (2ª linha para começar com apache e não ^ Gpache

Sua opinião é muito apreciada.

    
por frank 02.04.2015 / 20:07

2 respostas

2

Existe algum motivo particular para usar sed? Por que não ...

echo -e '\n# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\napache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\nDefaults:apache !requiretty' >>/etc/sudoers

O primeiro 'a' de 'apache' está sendo escapado pelo '\' logo antes, resultando em seu '^ Gpache'. Você deve ser capaz de resolver essa situação em particular simplesmente removendo o '\' após o seu '\ n'. Começar seu comentário em uma nova linha provavelmente poderia ser realizado inserindo um '\ n' após o seu '$ a \'. Talvez algo como ...

sed -i -e '$a\ \n# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\napache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\nDefaults:apache !requiretty' /etc/sudoers

Divulgação completa: não testei nenhuma dessas soluções.

    
por 02.04.2015 / 21:04
3

Porque o caractere \a é Ctrl + G - você não precisa escapar do caractere após \n

Para manutenibilidade, eu recomendo que você reduza um pouco o one-linness dele e use newlines reais para continuar o comando a . Isso também ativa a linha em branco que você deseja.

sed -i -e '$a\
\
# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\
Defaults:apache !requiretty' /etc/sudoers
    
por 02.04.2015 / 20:37