#!/bin/bash set -e # ============================================================ # Configuração inicial de VM Debian 13 # # Funções: # - Altera hostname # - Altera domínio # - Recria /etc/hosts # - Detecta todas as interfaces de rede # - Recria /etc/network/interfaces do zero # - Pergunta por interface: # DHCP # Estático # Não configurar # - Limpa históricos # - Desliga a máquina ao final # # Compatível com: # curl -fsSL URL | bash # ============================================================ # ============================================================ # FUNÇÕES # ============================================================ read_tty() { local prompt="$1" local varname="$2" read -rp "$prompt" "$varname" < /dev/tty } valid_ipv4() { local ip="$1" local IFS=. local -a octets read -ra octets <<< "$ip" [ "${#octets[@]}" -eq 4 ] || return 1 for octet in "${octets[@]}"; do [[ "$octet" =~ ^[0-9]+$ ]] || return 1 [ "$octet" -ge 0 ] 2>/dev/null || return 1 [ "$octet" -le 255 ] 2>/dev/null || return 1 done return 0 } valid_hostname() { local hostname="$1" [[ "$hostname" =~ ^[a-zA-Z0-9][a-zA-Z0-9.-]*[a-zA-Z0-9]$ ]] || [[ "$hostname" =~ ^[a-zA-Z0-9]$ ]] } # ============================================================ # ROOT # ============================================================ if [ "$EUID" -ne 0 ]; then echo echo "ERRO: execute este script como root." echo exit 1 fi # ============================================================ # CABEÇALHO # ============================================================ clear 2>/dev/null || true echo echo "============================================================" echo " CONFIGURAÇÃO INICIAL - DEBIAN 13" echo "============================================================" echo # ============================================================ # HOSTNAME # ============================================================ while true; do read_tty "Novo nome da máquina: " NEW_HOSTNAME if [ -z "$NEW_HOSTNAME" ]; then echo "O nome da máquina não pode ficar vazio." continue fi if ! valid_hostname "$NEW_HOSTNAME"; then echo "Hostname inválido." continue fi break done # ============================================================ # DOMÍNIO # ============================================================ while true; do read_tty "Domínio (ex.: fatec.local): " NEW_DOMAIN if [ -z "$NEW_DOMAIN" ]; then echo "O domínio não pode ficar vazio." continue fi if ! valid_hostname "$NEW_DOMAIN"; then echo "Domínio inválido." continue fi break done FQDN="${NEW_HOSTNAME}.${NEW_DOMAIN}" # ============================================================ # CONFIRMAÇÃO # ============================================================ echo echo "------------------------------------------------------------" echo "Hostname : $NEW_HOSTNAME" echo "Domínio : $NEW_DOMAIN" echo "FQDN : $FQDN" echo "------------------------------------------------------------" echo read_tty "Continuar? [S/n]: " CONFIRM case "$CONFIRM" in n|N|nao|não|NAO|NÃO) echo echo "Operação cancelada." exit 0 ;; esac # ============================================================ # HOSTNAME # ============================================================ echo echo "Configurando hostname..." echo "$NEW_HOSTNAME" > /etc/hostname hostnamectl set-hostname "$NEW_HOSTNAME" # ============================================================ # /etc/hosts # ============================================================ echo "Configurando /etc/hosts..." cat > /etc/hosts < /etc/network/interfaces <<'EOF' # ============================================================ # Configuração de rede # Gerada automaticamente pelo script de configuração inicial # ============================================================ auto lo iface lo inet loopback EOF # ============================================================ # CONFIGURAÇÃO DAS INTERFACES # ============================================================ for IFACE in "${INTERFACES[@]}"; do MAC="desconhecido" if [ -f "/sys/class/net/$IFACE/address" ]; then MAC=$(cat "/sys/class/net/$IFACE/address") fi echo echo "============================================================" echo " INTERFACE: $IFACE" echo " MAC: $MAC" echo "============================================================" echo echo "1) DHCP" echo "2) IP estático" echo "3) Não configurar" echo while true; do read_tty "Escolha [1/2/3]: " OPTION case "$OPTION" in # ==================================================== # DHCP # ==================================================== 1) cat >> /etc/network/interfaces <> /etc/network/interfaces <> /etc/network/interfaces fi if [ -n "$DNS" ]; then echo " dns-nameservers $DNS" >> /etc/network/interfaces fi if [ -n "$DNS_SEARCH" ]; then echo " dns-search $DNS_SEARCH" >> /etc/network/interfaces fi echo echo "$IFACE configurada com IP estático." break ;; # ==================================================== # NÃO CONFIGURAR # ==================================================== 3) echo echo "$IFACE não será adicionada ao /etc/network/interfaces." break ;; *) echo "Opção inválida. Escolha 1, 2 ou 3." ;; esac done done # ============================================================ # PERMISSÕES # ============================================================ chmod 644 /etc/network/interfaces # ============================================================ # MOSTRA RESULTADO # ============================================================ echo echo "============================================================" echo " CONFIGURAÇÃO FINAL" echo "============================================================" echo echo "Hostname : $NEW_HOSTNAME" echo "Domínio : $NEW_DOMAIN" echo "FQDN : $FQDN" echo echo "------------------------------------------------------------" echo "/etc/network/interfaces" echo "------------------------------------------------------------" echo cat /etc/network/interfaces echo echo "------------------------------------------------------------" echo # ============================================================ # CONFIRMA DESLIGAMENTO # ============================================================ echo echo "A configuração foi concluída." echo echo "A máquina será desligada ao final da limpeza." echo read_tty "Pressione ENTER para finalizar e desligar..." FINAL_CONFIRM # ============================================================ # LIMPEZA DE HISTÓRICO # ============================================================ echo echo "Limpando históricos..." # ------------------------------------------------------------ # Histórico do root # ------------------------------------------------------------ history -c 2>/dev/null || true rm -f /root/.bash_history rm -f /root/.zsh_history rm -f /root/.python_history rm -f /root/.lesshst rm -f /root/.wget-hsts # ------------------------------------------------------------ # Usuários normais # ------------------------------------------------------------ while IFS=: read -r USERNAME PASSWORD UID GID GECOS HOME_DIR SHELL; do if [ "$UID" -ge 1000 ] && [ "$UID" -lt 65534 ] && [ -d "$HOME_DIR" ]; then rm -f "$HOME_DIR/.bash_history" rm -f "$HOME_DIR/.zsh_history" rm -f "$HOME_DIR/.python_history" rm -f "$HOME_DIR/.lesshst" rm -f "$HOME_DIR/.wget-hsts" fi done < /etc/passwd # ------------------------------------------------------------ # Evita regravar o histórico desta sessão # ------------------------------------------------------------ unset HISTFILE export HISTFILE=/dev/null # ============================================================ # SINCRONIZA ALTERAÇÕES # ============================================================ sync # ============================================================ # FINALIZAÇÃO # ============================================================ echo echo "============================================================" echo " CONFIGURAÇÃO CONCLUÍDA" echo "============================================================" echo echo "Hostname : $NEW_HOSTNAME" echo "FQDN : $FQDN" echo echo "Rede configurada em:" echo "/etc/network/interfaces" echo echo "Históricos removidos." echo echo "Desligando a máquina..." echo sleep 3 # ============================================================ # DESLIGA # ============================================================ systemctl poweroff