Usando SED para descomentar uma linha de arquivo de configuração e substituir texto em um arquivo de configuração do Linux

Usando SED para descomentar uma linha de arquivo de configuração e substituir texto em um arquivo de configuração do Linux

Estou tentando automatizar a configuração de determinados parâmetros em meu /etc/ssh/sshd_configarquivo, principalmente o

#PermitRootLogin yes

e

#LoginGraceTime 2m

Eles deveriam ler:

PermitRootLogin no
LoginGraceTime 60

Não sou um especialista em scripts, então, por favor, tenha paciência comigo ...

Tentei sed -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_configfazer a bola rolar, mas obtive um resultado estranho. Ele simplesmente elimina o arquivo no qual estou tentando trabalhar ...

Alguém pode me orientar sobre o uso do sed?

Responder1

Redirecione a saída para um arquivo temporário e renomeie o arquivo temporário para o arquivo original

sed -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_config > /etc/ssh/sshd_config.tmp && mv -f /etc/ssh/sshd_config.tmp /etc/ssh/sshd_config

Ou se você tiver GNU sedvocê pode usar a -iopção de edição no local

sed -i -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_config

Responder2

Semelhante à resposta do @Bodo, mas esta solução deixa a linha original intacta e adiciona a versão modificada abaixo da linha original. Isso só faz sentido se você quiser manter a linha original como comentário.

 sed -i'' -n 'p;s/#\(LoginGraceTime\) 2m/\1 60/p;s/#\(PermitRootLogin\) yes/\1 no/p' /etc/ssh/sshd_config

Aqui usamos um grupo de captura \(...\)que é substituído por \1na substituição (porque temos preguiça de digitar a mesma string novamente).

Sed com a opção -ngera apenas as linhas impressas explicitamente, então o primeiro pé usado para imprimir as linhas não modificadas e os próximos dois comandos para imprimir as linhas modificadas.

informação relacionada