sed: substituindo entradas no / etc / fstab

4

Estou no processo de endurecimento de alguns dos nossos sistemas. Como parte desse processo de proteção, preciso atualizar algumas entradas no / etc / fstab para limitar os recursos de algumas das várias partições.

Com isso dito, gostaria de poder usar uma substituição in-line sed para atualizar as linhas. Abaixo está um trecho do / etc / fstab atual:

# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

Depois que o comando sed é executado, gostaria que o arquivo se parecesse com o seguinte:

# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

Basicamente, eu preciso adicionar "nodev" a todas as linhas que são ext [2-4], que não são a partição raiz.

O comando sed que eu coloquei perto de fazer isso, mas por alguma razão, não consigo fazer com que o regex não corresponda à partição "/", então ele sempre atualiza essa linha também.

sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab

Eu gostaria de desligar o "/" cercado por espaços, não o vg1-lv_root. Os seguintes trabalhos, mas eu não gosto da solução porque é desajeitado:

sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab | sed '/^[^#].*root.*ext[2-4]/s/defaults,nodev/defaults/' > /etc/fstab
    
por Jason 12.11.2018 / 13:50

4 respostas

5

Você pode usar awk para adicionar a lógica para adicionar a string e column para reformatar o arquivo de saída final. Supondo que você tenha permissões de gravação para as pastas /etc/ e /tmp/

tempfile=$(mktemp /tmp/tmpfile.XXXXXXXX)

Isso criaria o arquivo temporário no caminho /tmp/ no qual você pode gravar a saída awk e redirecioná-la de volta ao arquivo original

awk '$3 ~ "ext[2-4]"{ $4=$4",nodev" }1 ' /etc/fstab | column -t > "$tempfile" && mv -- "$tempfile" /etc/fstab

A parte column -t é apenas redundante e necessária para que o arquivo de saída seja mais legível, em vez de torná-lo desordenado e desajeitado.

    
por 12.11.2018 / 14:05
5

Aqui está uma abordagem mais simples de sed :

$ sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

O truque é procurar espaços em branco seguidos por / e um ou mais caracteres que não sejam espaços em branco ( \s/\S+ ), então ext[2-4] mas apenas se precedidos por espaço em branco ( \s+ext[2-4] ), mais espaço em branco e% código%. Isso deve corresponder apenas aos casos em que você está interessado. Portanto, se corresponder, substitua a correspondência inteira por ela mesma, além de defaults : nodev .

No entanto, não sei ao certo como isso é portátil. O ,nodev para expressões regulares estendidas é suportado por muitas -E implementações, mas não é POSIX. Para uma abordagem mais portátil, você pode tentar a mesma ideia em Perl:

$ perl -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

Em ambos os casos, para editar o arquivo, use sed :

perl -i -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|,nodev|' fstab 
sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|,nodev|' fstab 

Ou, para BSD ou OSX -i :

sed -i '' -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|,nodev|' fstab 

Observe que os itens acima assumem que a opção sed será a única ou, pelo menos, a última. Eles falharão se você tiver algo como defaults , por exemplo.

    
por 12.11.2018 / 14:54
3

É claro que, dez minutos depois de postar a pergunta, eu finalmente consegui fazer o que eu queria com o seguinte:

sed -r '/^[^#].*[ \t]+\/[^[:space:]].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab

Se alguém tiver uma resposta mais limpa ou mais infalível, adoraria ouvir. Obrigado!

    
por 12.11.2018 / 14:11
0

Excluir partidas é difícil de manter. É mais seguro corresponder apenas à partição desejada. E, por corresponder apenas uma linha, o rastreio 'g' não é necessário.

sed -r 's#(/home\s.*defaults)\s#,nodev #' /etc/fstab 
    
por 13.11.2018 / 05:28