Como usar o regex no sed?

1

Eu preciso revogar o acesso do sudo ao usuário usando sed em scripts.
Quero comentar o usuário apenas se a linha contiver / bin / su - root
Vamos considerar o arquivo como abaixo, no qual eu tenho que comentar apenas a primeira linha.

mindadmin  ALL = NOPASSWD: /bin/su - root
mindadmin  ALL = NOPASSWD: /bin/ifconfig

Eu usei os comandos sed como abaixo:

sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin  ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers 

Mas não está funcionando. Existe algum erro de sintaxe?

    
por KALAI SELVAN 06.11.2014 / 10:29

4 respostas

1

Existem dois problemas, o primeiro é que o seu sudoers tem mindadmin e o seu padrão minadmin (sem o d ).

O segundo problema está no / s de /bin/su , você tem que escapar deles dentro do regex:

sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin  ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers

caso contrário, eles terminam o padrão.

Você também pode ver outro delimitador em vez de / , contanto que isso não ocorra no arquivo, você não precisa escapar dele.

    
por 06.11.2014 / 10:34
1
 sed  '/\/bin\/su - root/ s/^/#/'  filename

Localiza as linhas, no nome do arquivo, contendo /bin/su - root e adiciona o comentário (#) no início da linha (^).

Adicione a opção -i em sed para efetuar o arquivo.

    
por 06.11.2014 / 11:03
1

Se você quiser comentar todas as linhas que contêm /bin/su - root no final da linha, simplifique sua expressão sed:

sed 's/.*\/bin\/su - root$/#&/'

Ou ainda mais simples

sed 's,.*/bin/su - root$,#&,'

Para comentar todas as linhas que contenham /bin/su - root em qualquer lugar da linha:

sed 's,.*/bin/su - root,#&,'
    
por 06.11.2014 / 10:51
0

Como & é substituído por todo o padrão de correspondência, aqui outra solução:

sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers

/ é substituído por um separador diferente para que você não precise escapar dele. O padrão também é mais flexível se o espaçamento após o comando su for diferente.

Se for necessário alterar apenas o usuário admin min d :

sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers

A bandeira -i aplica diretamente a alteração no arquivo.

    
por 06.11.2014 / 11:42