AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 759994
Accepted
yael
yael
Asked: 2023-10-27 19:37:36 +0800 CST2023-10-27 19:37:36 +0800 CST 2023-10-27 19:37:36 +0800 CST

linux + excluir por script bash os números UUID não utilizados/incorretos do arquivo fstab

  • 772

nosso objetivo é criar um script bash que exclua os números UUID não utilizados/desnecessários do /etc/fstabarquivo,

breve histórico - em nossos laboratórios, temos mais de 500 servidores RHEL e queremos corrigir os fstabarquivos que possuem fstabconfiguração incorreta, como números UUID não utilizados ou números UUID não utilizados que estão nas linhas de comentários, etc.

criamos o seguinte script bash como exemplo.

#!/bin/bash


blkid_list_of_uuid=` blkid | awk -F'UUID=' '{print $2}' | awk '{print $1}' | sed s'/"/ /g' `
grep UUID /etc/fstab >/tmp/fstab

while read line_from_fstab
do
        echo "checking if ${line_from_fstab} is unused UUID"
        if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
        then
           #sed -i "/$line_from_fstab/d" /etc/fstab
           echo "delete unused line ${line_from_fstab} from fstab"
        fi
done < /tmp/fstab

capturamos o blkidnúmero na blkid_list_of_uuidvariável. e filtre as linhas UUID do fstab para o /tmp/fstabarquivo

o objetivo da sintaxe if - [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]] é excluir por sed (por enquanto em comentário) as linhas UUID /etc/fstabque não estão em uso

mas o regex não está funcionando e o script exclui o UUID que está em uso

exemplo de blkid

blkid
/dev/mapper/vg-VOL_root: UUID="49232c87-6c49-411d-b744-c6c847cfd8ec" TYPE="xfs"
/dev/sda2: UUID="Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu" TYPE="LVM2_member"
/dev/sda1: UUID="0d5c6164-bb9b-43f4-aa9b-092069801a1b" TYPE="xfs"
/dev/mapper/vg-VOL_swap: UUID="81140364-4b8e-412c-b909-ef0432162a45" TYPE="swap"
/dev/mapper/vg-VOL_var: UUID="e1574eeb-5a78-4a52-b7e3-c53e2b8a4220" TYPE="xfs"
/dev/sdb: UUID="547977e2-a899-4a75-a31c-e362195c264c" TYPE="ext4"
/dev/mapper/vg-VOL_docker: UUID="2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b" TYPE="xfs"
/dev/sdc: UUID="1a289232-0cfe-4df7-9ad5-6a6e2362a1c5" TYPE="ext4"
/dev/sdd: UUID="91493d1f-ffe9-4f5f-aa6d-586d2c99f029" TYPE="ext4"
/dev/sde: UUID="f11845e7-1dcb-4b81-a1d4-9a5fe7da6240" TYPE="ext4"
bash
  • 4 4 respostas
  • 266 Views

4 respostas

  • Voted
  1. Best Answer
    terdon
    2023-10-27T22:04:38+08:002023-10-27T22:04:38+08:00

    A razão pela qual não está funcionando é porque você está tentando combinar as coisas erradas. Isto é o que sua blkidvariável contém:

    $ printf '%s\n' "$blkid_list_of_uuid"
     49232c87-6c49-411d-b744-c6c847cfd8ec 
     Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu 
     0d5c6164-bb9b-43f4-aa9b-092069801a1b 
     81140364-4b8e-412c-b909-ef0432162a45 
     e1574eeb-5a78-4a52-b7e3-c53e2b8a4220 
     547977e2-a899-4a75-a31c-e362195c264c 
     2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b 
     1a289232-0cfe-4df7-9ad5-6a6e2362a1c5 
     91493d1f-ffe9-4f5f-aa6d-586d2c99f029 
     f11845e7-1dcb-4b81-a1d4-9a5fe7da6240 
    

    Isso significa que isso:

    if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
    

    fica algo assim:

    if [[ ! "UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1" =~ " 49232c87-6c49-411d-b744-c6c847cfd8ec 
     Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu 
     0d5c6164-bb9b-43f4-aa9b-092069801a1b 
     81140364-4b8e-412c-b909-ef0432162a45 
     e1574eeb-5a78-4a52-b7e3-c53e2b8a4220 
     547977e2-a899-4a75-a31c-e362195c264c 
     2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b 
     1a289232-0cfe-4df7-9ad5-6a6e2362a1c5 
     91493d1f-ffe9-4f5f-aa6d-586d2c99f029 
     f11845e7-1dcb-4b81-a1d4-9a5fe7da6240 
    " ]]
    

    Claro, isso nunca será verdade: você está procurando a fstablinha inteira na lista de UUIDs encontrados. O que você queria fazer é procurar o UUIDúnico.

    Não faça isso, use um dos métodos fornecidos nas outras respostas, usar o shell para esse tipo de coisa é uma má ideia , mas para completar, aqui está uma abordagem baseada principalmente no shell usando a lógica que acho que você quis dizer usar (observe que isso requer GNU grep):

    $ grep -oP '^UUID=\S+' /etc/fstab | sed 's/=/="/; s/$/"/' | 
      while read -r fstab; do 
        sudo blkid |   
          grep -q "$fstab" && 
            echo "GOOD: $fstab" || 
              echo "BAD: $fstab"; done
    BAD: UUID="e16a3de8-a58f-430f-b80f-3d87e9fb0b1d"
    BAD: UUID="ef6747e2-f802-4b18-9169-ae65f9933ef1"
    BAD: UUID="b00792c8-f7e0-4448-b98d-021eede31e6c"
    GOOD: UUID="32133dd7-9a48-4b9d-b2e0-6e383e95631d"
    GOOD: UUID="69ae5a79-9a15-489c-951d-1e0c2a16b7fc"
    GOOD: UUID="6E5E-90F0"
    GOOD: UUID="ff3c9de1-417c-4c4d-8150-a89d222ae60b"
    

    São BAD:os UUIDs do meu /etc/fstabarquivo que não foram encontrados na saída do blkidmeu sistema.

    • 3
  2. Ed Morton
    2023-10-27T21:03:10+08:002023-10-27T21:03:10+08:00

    Sem entrada de amostra e saída esperada, é um palpite não testado, mas acho que é isso que você deseja, usando qualquer awk:

    #!/usr/bin/env bash
    
    tmp=$(mktemp) || exit 1
    trap 'rm -f "$tmp"; exit' EXIT
    
    blkid |
    awk '
        NR == FNR {
            gsub(/"/,"",$2)
            blkids[$2]
            next
        }
        !/^UUID/ || ($1 in blkids)
    ' - /etc/fstab > "$tmp" &&
    mv -- "$tmp" /etc/fstab
    

    O texto acima assume blkido formato de saída conforme mostrado em https://linux.101hacks.com/unix/blkid :

    /dev/sdb1: UUID="6e0acfe3-81ed-4f9f-8ab5-0d65ba1f0ef2" TYPE="ext2"
    /dev/sdc1: UUID="aa82d7bb-ab2b-4739-935f-fd8a5c9a6cb0" TYPE="ext2"
    /dev/sda1: UUID="187171ab-c9b8-43ec-b0bb-77c736ca22e0" TYPE="ext4" LABEL="/home"
    /dev/sda2: UUID="1a225baa-7027-4619-aaa5-900e24c1fdff" TYPE="swap"
    /dev/sdb3: UUID="2a294b33-eb61-40a3-b3fc-ad6eaf7f156f" TYPE="ext2"
    

    e /etc/fstabformato de conteúdo conforme mostrado em https://wiki.archlinux.org/title/fstab :

    # <device>                                <dir> <type> <options> <dump> <fsck>
    UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1
    UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap   defaults  0      0
    UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4   defaults  0      2
    

    conforme encontrado por uma rápida pesquisa no Google.

    • 2
  3. Archemar
    2023-10-27T20:45:03+08:002023-10-27T20:45:03+08:00

    Não tenho certeza se você pode usar uma lista de uuid como regexp.

    para pegar essa lista eu usei

    blkid | awk -F\" '{for(i=1;i<=NF;i++) if ($i ~ / UUID=/ ) { i++; print $i ; break ; }  }'
    

    onde

    • -F\"usar "como separador
    • for(i=1;i<=NF;i++)ande na linha
    • if ($i ~ / UUID=/ )se UUID= for encontrado ( spaceantes do UUID ser obrigatório) ...
    • { i++ ; print $i ; break ; } }'.. obtenha o próximo campo (UUID real) e imprima-o, saia do loop.

    em seguida eu uso um simplesgrep

    if ! echo "${blkid_list_of_uuid}" | grep ${line_from_fstab}
    

    (você pode usar grep -qpara diminuir o lixo)

    esse resultado em

    blkid_list_of_uuid=$(blkid | awk -F\" '{for(i=1;i<=NF;i++) if ($i ~ / UUID=/ ) { i++ ; print $i ; break ; } }' )
    grep UUID /etc/fstab >/tmp/fstab
    while read line_from_fstab
    do
            echo "checking if ${line_from_fstab} is unused UUID"
            if ! echo "${blkid_list_of_uuid}" | grep ${line_from_fstab}
            then
               #sed -i "/$line_from_fstab/d" /etc/fstab
               echo "delete unused line ${line_from_fstab} from fstab"
            fi
    done < /tmp/fstab
    

    • raramente há necessidade de canalizar dois awke umsed

    • blkid_list_of_uuid também pode ser armazenado em um arquivo temporário, resultando em

       grep -q ${line_from_fstab} /tmp/blkid_list_of_uuid
      

      (não funcionará porque ${line_from_fstab}não é um uuid)

    • conforme apontado, implantar e executar script bash em 500 VMs pode não ser uma boa ideia no longo prazo, eu consideraria ansible.

    • 1
  4. JoL
    2023-10-28T06:32:43+08:002023-10-28T06:32:43+08:00

    Terdon respondeu o que você fez de errado. Vou apenas fornecer um exemplo de uma maneira mais simples de fazer o que você tentou:

    lsblk -no uuid | grep . | grep -Ff- /etc/fstab 
    

    Isso deve gerar fstab como você deseja, com a diferença de que isso não trata os UUIDs como expressões regulares ou sedcomandos potenciais. Você pode direcionar a saída para /tmp/fstabmovê-la para /etc/fstab.

    Eu usei lsblkem vez de blkidporque a página de manual blkidrecomenda lsblke lsblknão requer privilégios de root, embora blkidaparentemente exija.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve