Automação

Scripts que economizam horas de trabalho

Exemplos de scripts bash e Python para rotinas de administração de servidores Linux que toda equipe de TI deveria ter.

Por WSUL Tecnologia — 25 de junho de 2025  ·  9 min de leitura

Filosofia dos scripts úteis

Um bom script de administração tem três características: faz uma coisa só e faz bem, tem output claro (incluindo em caso de erro), e pode ser executado com segurança mais de uma vez. Scripts complexos que fazem dez coisas geralmente quebram na décima primeira situação.

Scripts bash essenciais

Inventário rápido do servidor

#!/bin/bash
# inventory.sh — resumo do ambiente
echo "=== INVENTÁRIO: $(hostname) ==="
echo "Data: $(date)"
echo ""
echo "--- Sistema ---"
cat /etc/os-release | grep PRETTY_NAME
uname -r
echo "Uptime: $(uptime -p)"
echo ""
echo "--- Hardware ---"
echo "CPU: $(nproc) cores — $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
echo "RAM: $(free -h | awk '/^Mem:/{print $2}') total, $(free -h | awk '/^Mem:/{print $7}') disponível"
echo ""
echo "--- Disco ---"
df -h | grep -v tmpfs | grep -v udev
echo ""
echo "--- Serviços ativos ---"
systemctl list-units --type=service --state=running --no-pager --no-legend | awk '{print $1}'
echo ""
echo "--- Portas em escuta ---"
ss -tlnp | grep LISTEN

Limpeza segura de disco

#!/bin/bash
# disk-cleanup.sh — limpeza conservadora de disco
echo "Espaço antes:"
df -h /

# Limpar cache do apt
apt-get clean
apt-get autoremove -y

# Limpar logs com mais de 30 dias
find /var/log -name "*.gz" -mtime +30 -delete
find /var/log -name "*.1" -mtime +30 -delete
journalctl --vacuum-time=30d --vacuum-size=500M

# Limpar arquivos temporários
find /tmp -mtime +7 -delete 2>/dev/null
find /var/tmp -mtime +30 -delete 2>/dev/null

echo "Espaço depois:"
df -h /

Verificação de usuários sudo

#!/bin/bash
# audit-sudo.sh — auditoria de usuários privilegiados
echo "=== USUÁRIOS COM SUDO ==="
echo ""
echo "Membros do grupo sudo:"
getent group sudo | cut -d: -f4 | tr ',' '
'

echo ""
echo "Entradas NOPASSWD (sem senha para sudo):"
grep -r NOPASSWD /etc/sudoers /etc/sudoers.d/ 2>/dev/null || echo "Nenhuma"

echo ""
echo "Usuários com UID 0 (root equivalente):"
awk -F: '$3 == 0 {print $1}' /etc/passwd

echo ""
echo "Último acesso SSH por usuário:"
last -n 20 | grep -v "reboot\|wtmp" | awk '{print $1, $3, $4, $5, $6, $7}' | column -t

Backup incremental com rsync

#!/bin/bash
# rsync-backup.sh — backup incremental com link de hard links
SRC="/var/www"
DEST="/backup/www"
DATE=$(date +%Y-%m-%d)
LATEST="/latest"

rsync -avz --delete \
    --link-dest="" \
    "/" \
    "//"

# Atualizar link para o backup mais recente
rm -f ""
ln -s "/" ""

echo "Backup concluído: /"
du -sh "/"

Scripts Python práticos

Verificador de certificados SSL em lote

#!/usr/bin/env python3
# check-ssl.py — verificar múltiplos domínios
import ssl, socket
from datetime import datetime

dominios = ["wsul.net", "outro.com.br", "mais-um.net"]

for dominio in dominios:
    try:
        ctx = ssl.create_default_context()
        with ctx.wrap_socket(socket.socket(), server_hostname=dominio) as s:
            s.settimeout(5)
            s.connect((dominio, 443))
            cert = s.getpeercert()
        expiry = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
        dias = (expiry - datetime.utcnow()).days
        status = "✓" if dias > 30 else "⚠ ALERTA"
        print(f"{status} {dominio}: {dias} dias restantes")
    except Exception as e:
        print(f"✗ ERRO {dominio}: {e}")

Parser de logs de falha SSH

#!/usr/bin/env python3
# ssh-fail-report.py — top IPs com falhas de autenticação
from collections import Counter
import re

ips = []
with open("/var/log/auth.log") as f:
    for line in f:
        if "Failed password" in line:
            match = re.search(r'from (\d+\.\d+\.\d+\.\d+)', line)
            if match:
                ips.append(match.group(1))

print(f"Total de falhas: {len(ips)}")
print("
Top 10 IPs atacantes:")
for ip, count in Counter(ips).most_common(10):
    print(f"  {count:5d}x  {ip}")

Organizando seu arsenal de scripts

Scripts úteis perdidos em servidores aleatórios perdem valor rapidamente. Recomendamos:

  • Manter todos os scripts em um repositório Git privado
  • Usar um diretório padrão em cada servidor: /opt/scripts/
  • Cada script com cabeçalho documentando: propósito, autor, data e parâmetros
  • README.md descrevendo quando usar cada script
  • Testar em staging antes de usar em produção

Conclusão

Scripts bem escritos são documentação executável. Eles codificam o conhecimento operacional da equipe de uma forma que pode ser auditada, compartilhada e reutilizada. Cada hora investida em um bom script retorna múltiplas vezes ao longo do tempo.

Sua infraestrutura tem esses riscos?

Solicite um diagnóstico gratuito e descubra em quais pontos seu ambiente pode ser melhorado.