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"