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.