Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Exercícios da Luri

Querides, bão?

Seguinte, ao final da aula pedi sugestões de exercícios para a Luri e o primeiro foi o seguinte:

Um exercício baseado nessa aula seria criar um script em shell que utilize os comandos lshw, free, lscpu e dmidecode para coletar informações do sistema e gerar um relatório. O script deve exibir informações como modelo do computador, quantidade de memória RAM, informações da CPU e versão da BIOS. Além disso, o script pode incluir filtros para exibir apenas as informações desejadas. Isso ajudará a praticar o uso desses comandos e a automatizar a obtenção de informações do sistema.

Então eu fiz o script abaixo:

#!/bin/bash
lshw | head -n 2 > ~/exercicioscript.txt
echo " " >> ~/exercicioscript.txt
echo "Informações de memória:" >> ~/exercicioscript.txt
free | tr -s " " | cut -d " " -f1-4 >> ~/exercicioscript.txt
echo " " >> ~/exercicioscript.txt
echo "Informações da CPU:" >> ~/exercicioscript.txt
lscpu | head -n 17 >> ~/exercicioscript.txt
echo " " >> ~/exercicioscript.txt
echo "Informações da BIOS: " >> ~/exercicioscript.txt
sudo dmidecode | grep -A 20 BIOS Information >> ~/exercicioscript.txt
echo "Pronto."

Deu tudo certo, o script rodou bem, pediu a senha pois tem um sudo na penultima linha e o arquivo foi criado com as informações que pedi no script.

Então pedi mais um exercicío e veio o seguinte:

Um exercício baseado nessa aula seria criar um script em shell que utilize o comando lshw para listar todas as interfaces de rede disponíveis no sistema. O script deve exibir informações como nome da interface, endereço MAC e endereço IP atribuído. Além disso, o script pode incluir filtros para exibir apenas as interfaces ativas ou apenas as interfaces com endereços IP configurados. Isso ajudará a praticar o uso do comando lshw e a obter informações específicas do sistema relacionadas às interfaces de rede.

A minha dificuldade veio por não ter certeza de quais interfaces estão ativas. Por exemplo, na informação abaixo, Como eu posso saber, se essa interface está ativa ou não?

                descrição: Interface sem fio
                produto: RTL8822CE 802.11ac PCIe Wireless Network Adapter
                fabricante: Realtek Semiconductor Co., Ltd.
                ID físico: 0
                informações do barramento: pci@0000:01:00.0
                nome lógico: wlp1s0
                versão: 00
                serial: 00:45:e2:eb:44:ed
                largura: 64 bits
                clock: 33MHz
                capacidades: pm msi pciexpress bus_master cap_list ethernet physical wireless
                configuração: broadcast=yes driver=rtw_8822ce driverversion=6.5.4-76060504-generic firmware=N/A ip=192.168.0.103 latency=0 link=yes multicast=yes wireless=IEEE 802.11
                recursos: irq:68 porta de E/S:2000(tamanho=256) memória:fd600000-fd60ffff"
3 respostas

Além desse conteúdo de interface de rede existe o seguinte:

*-network
                descrição: Interface sem fio
                produto: RTL8822CE 802.11ac PCIe Wireless Network Adapter
                fabricante: Realtek Semiconductor Co., Ltd.
                ID físico: 0
                informações do barramento: pci@0000:01:00.0
                nome lógico: wlp1s0
                versão: 00
                serial: 00:45:e2:eb:44:ed
                largura: 64 bits
                clock: 33MHz
                capacidades: bus_master cap_list ethernet physical wireless
                configuração: broadcast=yes driver=rtw_8822ce driverversion=6.5.4-76060504-generic firmware=N/A ip=192.168.0.103 latency=0 link=yes multicast=yes wireless=IEEE 802.11
                recursos: irq:68 porta de E/S:2000(tamanho=256) memória:fd600000-fd60ffff

As informações são identicas diferindo apenas das informações que vem depois do clock. Então, alguém pode me dar uma sugestão de como eu poderia listar ambos os conteúdos se eles possuem tantas informações identicas? Pergunto, pois não seria necessáriamente prático abrir o arquivo para vasculhar procurando pontos distintos para depois criar o filtro, concordam?

Existe alguma maneira de em um comando, listar todas as recorrências de determinado termo em um mesmo comando com o grep?

Desde já, agradeço.

solução!

Oi,

1. Aperfeiçoando seu Script

O script que você criou é um ótimo começo. No entanto, podemos torná-lo mais eficiente e legível.

#!/bin/bash

# Função para verificar se um comando está disponível
check_command() {
  command -v "$1" &> /dev/null
}

# Verifica se os comandos necessários estão instalados
if ! check_command lshw || ! check_command free || ! check_command lscpu || ! check_command dmidecode; then
  echo "Alguns comandos necessários não estão instalados. Certifique-se de que lshw, free, lscpu e dmidecode estejam disponíveis."
  exit 1
fi

# Coleta informações do sistema
{
  echo "Informações do sistema:"
  lshw -short  # Exibe informações resumidas
  echo -e "\nInformações de memória:"
  free
  echo -e "\nInformações da CPU:"
  lscpu
  echo -e "\nInformações da BIOS:"
  sudo dmidecode -t bios
} > ~/exercicioscript.txt

echo "Pronto. As informações foram salvas em ~/exercicioscript.txt."

Aqui estão algumas melhorias e explicações para o script aprimorado:

  • Adicionamos uma função check_command para verificar se os comandos necessários estão disponíveis no sistema. Isso evita que o script seja executado em sistemas que não possuem esses comandos, o que pode causar erros.

  • A verificação de disponibilidade dos comandos é feita no início do script. Se algum comando não estiver disponível, o script exibirá uma mensagem de erro e sairá.

  • Utilizamos { } para agrupar todas as saídas em um único arquivo (~/exercicioscript.txt). Isso torna o script mais eficiente, pois reduz a quantidade de vezes que o arquivo é aberto e fechado.

  • Adicionamos a opção -short ao comando lshw para obter informações resumidas, o que pode tornar o arquivo de saída mais legível.

2. Listando Informações das Interfaces de Rede

Agora, vamos abordar a sua segunda pergunta sobre como listar informações das interfaces de rede, mesmo quando elas têm muitas informações em comum. Você mencionou que as informações são idênticas até certo ponto, tornando difícil a distinção. Você está correto em considerar a eficiência e a praticidade ao criar um filtro. O comando grep pode ajudar, mas você precisa ser estratégico.

Para listar todas as ocorrências de um termo com grep, você pode usar a opção -o, que imprime apenas o que corresponde ao padrão. No seu caso, o padrão pode ser o início de cada seção de interface de rede. Considere o seguinte exemplo:

# Exemplo de listagem de todas as interfaces de rede no arquivo de saída
grep -E "descrição:|produto:|fabricante:|nome lógico:|ip=" ~/exercicioscript.txt

Nesse exemplo, usamos a opção -E para permitir expressões regulares estendidas. Em seguida, usamos o padrão "descrição:|produto:|fabricante:|nome lógico:|ip=" para corresponder a várias linhas que contêm essas informações-chave. Isso pode ajudar a listar todas as interfaces de rede no arquivo de saída. Lembre-se de que você pode personalizar esse padrão de acordo com suas necessidades.

No entanto, esta abordagem tem limitações. Se as informações das interfaces de rede forem exatamente as mesmas em diferentes seções, você pode obter resultados duplicados. Para evitar isso, você pode usar o comando awk para processar o arquivo de saída de maneira mais específica:

# Exemplo de listagem de interfaces de rede usando awk
awk '/descrição:/ {print "Descrição: " $2}
     /produto:/ {print "Produto: " $2}
     /fabricante:/ {print "Fabricante: " $2}
     /nome lógico:/ {print "Nome Lógico: " $3}
     /ip=/ {print "Endereço IP: " $2}' ~/exercicioscript.txt

Neste exemplo, estamos usando o awk para buscar linhas que contenham palavras-chave específicas e, em seguida, imprimir o valor relevante após essas palavras-chave. Isso pode ajudar a criar uma lista organizada das informações das interfaces de rede.

Esses são exemplos simples, e você pode adaptá-los com base nas necessidades específicas do seu sistema e nos detalhes exatos das informações das interfaces de rede. A escolha entre o uso de grep ou awk dependerá da complexidade do seu arquivo de saída.

Massa, agradeço muito a atenção e o detalhe nas informações. Parece que a cada dia dá pra apender ao menos uns 8 comandos novos. Não conhecia o awk, mas já o instalei e vou descobri-lo. Obrigado.