Scripts de Automação para Estrutura de Diretórios e Monitoramento de Servidores Linux

Visualização Hierárquica de Diretórios com Filtros

Para facilitar a navegação em sistemas de arquivos complexos, podemos criar um script que utiliza a freramenta tree para listar diretórios com suporte a buscas por palavras-chave. Este script permite visualizar a estrutura de um caminho específico ou do diretório atual de forma rápida.

#!/usr/bin/env bash
# Script para explorar a hierarquia de arquivos com suporte a busca

BUSCAR_EM="."
TERMO_PESQUISA=""

# Lógica para tratamento de argumentos
if [ $# -eq 1 ]; then
    TERMO_PESQUISA=$1
elif [ $# -eq 2 ]; then
    BUSCAR_EM=$2
    TERMO_PESQUISA=$1
fi

# Verifica se o diretório existe antes de prosseguir
if [ ! -d "$BUSCAR_EM" ]; then
    echo "Erro: Diretório $BUSCAR_EM não encontrado."
    exit 1
fi

echo "Explorando caminho: $(realpath "$BUSCAR_EM")"

# Executa o tree com suporte a cores e filtra pelo termo desejado
tree -C -f "$BUSCAR_EM" | grep --color=always "$TERMO_PESQUISA"

Exemplos de uso:

  • ./script.sh: Mostra toda a estrutura atual.
  • ./script.sh bin: Busca por "bin" no diretório atual.
  • ./script.sh config /etc: Busca por "config" dentro da pasta /etc.

A coloração padrão do terminal para tipos de arquivos costuma seguir este padrão:

  • Azul: Diretórios.
  • Verde: Arquivos executáveis.
  • Ciano: Links simbólicos.
  • Vermelho: Arquivos compactados ou links quebrados (se estiver piscando).
  • Amarelo: Arquivos de dispositivo.

Análise de Acessos e Conexões por IP

Em administração de sistemas, é vital monitorar quantas conexões estão ativas e a origem delas. O script abaixo consolida essas informações utilizando netstat ou ss.

#!/bin/bash
# Monitor de conexões ativas

gerar_relatorio() {
    local data_atual=$(date '+%Y-%m-%d %H:%M:%S')
    local conexoes_totais=$(ss -ant | wc -l)
    local ips_unicos=$(ss -ant | awk '{print $5}' | awk -F':' '{print $1}' | sort -u | wc -l)

    echo "--- Relatório de Acesso: $data_atual ---"
    echo "Total de conexões ativas: $conexoes_totais"
    echo "Quantidade de IPs únicos: $ips_unicos"
    echo "----------------------------------------"
}

if [[ "$1" == "--log" ]]; then
    gerar_relatorio >> /var/log/monitor_acesso.log
else
    gerar_relatorio
fi

Benchmark de Performence do Sistema

Para avaliar a saúde e o desempenho do servidor, é possível coletar dados de hardware e realizar testes de I/O de disco. O exemplo abaixo foca na captura de metdaados do sistema e performance de escrita.

#!/usr/bin/env bash

# Cores para saída formatada
VERMELHO='\033[0;31m'
VERDE='\033[0;32m'
AMARELO='\033[0;33m'
RESET='\033[0m'

get_info_sistema() {
    local cpu_model=$(awk -F: '/model name/ {name=$2; exit} END {print name}' /proc/cpuinfo | xargs)
    local mem_total=$(free -m | awk '/Mem/ {print $2}')
    local uptime_sistema=$(uptime -p)

    echo -e "${VERDE}Modelo CPU:${RESET} $cpu_model"
    echo -e "${VERDE}Memória Total:${RESET} ${mem_total}MB"
    echo -e "${VERDE}Tempo de Atividade:${RESET} $uptime_sistema"
}

teste_disco() {
    echo -en "${AMARELO}Iniciando teste de escrita em disco...${RESET}"
    local resultado_io=$( (LANG=C dd if=/dev/zero of=test_file_temp bs=64k count=16k conv=fdatasync && rm -f test_file_temp) 2>&1 | awk -F, '{io=$NF} END { print io}' )
    echo -e "\rVelocidade de I/O: ${VERMELHO}$resultado_io${RESET}"
}

echo "========================================"
get_info_sistema
teste_disco
echo "========================================"

Mitigação de Ataques de Força Bruta ou DoS

Uma estratégia comum para proteger serviços na porta 80 ou 443 é identificar sub-redes que realizam um número excessivo de conexões simultâneas e bloqueá-las temporariamente via iptables.

#!/bin/bash
# Bloqueio básico de sub-redes suspeitas

LIMITE_CONEXOES=15
ARQUIVO_TEMP="/tmp/ips_suspeitos.txt"

# Identifica blocos /16 com muitas conexões
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > "$ARQUIVO_TEMP"

while read -r linha; do
    qtd=$(echo "$linha" | awk '{print $1}')
    ip_origem=$(echo "$linha" | awk '{print $2}')

    # Filtra apenas IPs válidos e ignora localhost
    if [[ "$ip_origem" =~ ^[0-9]+\.[0-9]+ && "$qtd" -ge "$LIMITE_CONEXOES" ]]; then
        subrede=$(echo "$ip_origem" | cut -d. -f1,2).0.0/16
        echo "Bloqueando sub-rede suspeita: $subrede (Conexões: $qtd)"
        
        # Evita duplicidade no iptables
        iptables -C INPUT -s "$subrede" -p tcp --dport 80 -j DROP 2>/dev/null
        if [ $? -ne 0 ]; then
            iptables -I INPUT -s "$subrede" -p tcp --dport 80 -j DROP
        fi
    fi
done < "$ARQUIVO_TEMP"

Tags: Linux Bash shell-script SysAdmin devops

Publicado em 9-16 15:17