Atualizar conf-inicial

This commit is contained in:
2026-09-15 19:37:41 +00:00
parent 247dd2b331
commit 4c891e0ff5
+308 -77
View File
@@ -3,75 +3,179 @@
set -e set -e
# ============================================================ # ============================================================
# Preparação de VM Debian 13 # Configuração inicial de VM Debian 13
# #
# - Configura hostname # Funções:
# - Configura domínio # - Altera hostname
# - Detecta interfaces diretamente do sistema # - Altera domínio
# - Recria /etc/network/interfaces do ZERO # - Recria /etc/hosts
# - Permite DHCP ou IP estático por interface # - Detecta todas as interfaces de rede
# - Limpa histórico # - Recria /etc/network/interfaces do zero
# - Pergunta por interface:
# DHCP
# Estático
# Não configurar
# - Limpa históricos
# - Desliga a máquina ao final # - Desliga a máquina ao final
#
# Compatível com:
# curl -fsSL URL | bash
# ============================================================ # ============================================================
# ------------------------------------------------------------ # ============================================================
# Verifica root # 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 if [ "$EUID" -ne 0 ]; then
echo
echo "ERRO: execute este script como root." echo "ERRO: execute este script como root."
echo
exit 1 exit 1
fi fi
# ============================================================ # ============================================================
# HOSTNAME / DOMÍNIO # CABEÇALHO
# ============================================================ # ============================================================
clear 2>/dev/null || true
echo echo
echo "============================================================" echo "============================================================"
echo " CONFIGURAÇÃO DO HOST" echo " CONFIGURAÇÃO INICIAL - DEBIAN 13"
echo "============================================================" echo "============================================================"
echo echo
# ============================================================
# HOSTNAME
# ============================================================
while true; do while true; do
read -rp "Novo nome da máquina: " NEW_HOSTNAME
if [ -n "$NEW_HOSTNAME" ]; then read_tty "Novo nome da máquina: " NEW_HOSTNAME
break
if [ -z "$NEW_HOSTNAME" ]; then
echo "O nome da máquina não pode ficar vazio."
continue
fi fi
echo "O nome da máquina não pode ficar vazio." if ! valid_hostname "$NEW_HOSTNAME"; then
echo "Hostname inválido."
continue
fi
break
done done
while true; do # ============================================================
read -rp "Domínio (ex.: fatec.local): " NEW_DOMAIN # DOMÍNIO
# ============================================================
if [ -n "$NEW_DOMAIN" ]; then while true; do
break
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 fi
echo "O domínio não pode ficar vazio." if ! valid_hostname "$NEW_DOMAIN"; then
echo "Domínio inválido."
continue
fi
break
done done
FQDN="${NEW_HOSTNAME}.${NEW_DOMAIN}" FQDN="${NEW_HOSTNAME}.${NEW_DOMAIN}"
# ------------------------------------------------------------ # ============================================================
# Configura hostname # 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 echo "$NEW_HOSTNAME" > /etc/hostname
hostnamectl set-hostname "$NEW_HOSTNAME" hostnamectl set-hostname "$NEW_HOSTNAME"
# ------------------------------------------------------------ # ============================================================
# Recria /etc/hosts # /etc/hosts
# ------------------------------------------------------------ # ============================================================
echo "Configurando /etc/hosts..."
cat > /etc/hosts <<EOF cat > /etc/hosts <<EOF
127.0.0.1 localhost 127.0.0.1 localhost
@@ -84,19 +188,22 @@ EOF
# ============================================================ # ============================================================
# DETECÇÃO DAS INTERFACES # DETECTA INTERFACES
# ============================================================ # ============================================================
echo echo
echo "============================================================" echo "============================================================"
echo " DETECÇÃO DAS INTERFACES DE REDE" echo " INTERFACES DE REDE ENCONTRADAS"
echo "============================================================" echo "============================================================"
echo echo
mapfile -t INTERFACES < <( mapfile -t INTERFACES < <(
ls /sys/class/net | find /sys/class/net \
grep -v '^lo$' -mindepth 1 \
-maxdepth 1 \
-printf '%f\n' |
grep -v '^lo$' |
sort
) )
@@ -106,27 +213,37 @@ if [ "${#INTERFACES[@]}" -eq 0 ]; then
fi fi
echo "Interfaces encontradas:"
echo
for IFACE in "${INTERFACES[@]}"; do for IFACE in "${INTERFACES[@]}"; do
MAC=$(cat "/sys/class/net/$IFACE/address" 2>/dev/null || echo "desconhecido") MAC="desconhecido"
STATE="desconhecido"
echo " Interface: $IFACE" if [ -f "/sys/class/net/$IFACE/address" ]; then
echo " MAC: $MAC" MAC=$(cat "/sys/class/net/$IFACE/address")
fi
if [ -f "/sys/class/net/$IFACE/operstate" ]; then
STATE=$(cat "/sys/class/net/$IFACE/operstate")
fi
echo "Interface : $IFACE"
echo "MAC : $MAC"
echo "Estado : $STATE"
echo echo
done done
# ============================================================ # ============================================================
# RECRIA /etc/network/interfaces DO ZERO # RECRIA /etc/network/interfaces
# ============================================================ # ============================================================
cat > /etc/network/interfaces <<EOF echo "Recriando /etc/network/interfaces..."
cat > /etc/network/interfaces <<'EOF'
# ============================================================ # ============================================================
# Configuração de rede # Configuração de rede
# Gerada automaticamente # Gerada automaticamente pelo script de configuração inicial
# ============================================================ # ============================================================
auto lo auto lo
@@ -141,32 +258,37 @@ EOF
for IFACE in "${INTERFACES[@]}"; do for IFACE in "${INTERFACES[@]}"; do
MAC=$(cat "/sys/class/net/$IFACE/address" 2>/dev/null || echo "desconhecido") MAC="desconhecido"
if [ -f "/sys/class/net/$IFACE/address" ]; then
MAC=$(cat "/sys/class/net/$IFACE/address")
fi
echo echo
echo "============================================================" echo "============================================================"
echo " Interface: $IFACE" echo " INTERFACE: $IFACE"
echo " MAC: $MAC" echo " MAC: $MAC"
echo "============================================================" echo "============================================================"
echo echo
echo "Como deseja configurar esta interface?" echo "1) DHCP"
echo echo "2) IP estático"
echo " 1) DHCP" echo "3) Não configurar"
echo " 2) IP estático"
echo " 3) Não configurar"
echo echo
while true; do while true; do
read -rp "Opção [1/2/3]: " OPTION read_tty "Escolha [1/2/3]: " OPTION
case "$OPTION" in case "$OPTION" in
1)
# ==================================================== # ====================================================
# DHCP # DHCP
# ==================================================== # ====================================================
1)
cat >> /etc/network/interfaces <<EOF cat >> /etc/network/interfaces <<EOF
# ------------------------------------------------------------ # ------------------------------------------------------------
@@ -180,59 +302,129 @@ iface $IFACE inet dhcp
EOF EOF
echo echo
echo "$IFACE configurada para DHCP." echo "$IFACE configurada como DHCP."
break break
;; ;;
2)
# ==================================================== # ====================================================
# ESTÁTICO # ESTÁTICO
# ==================================================== # ====================================================
2)
echo echo
echo "Configuração estática de $IFACE" echo "Configuração estática de $IFACE"
echo echo
while true; do
read -rp "Endereço IPv4 (ex.: 192.168.10.20): " IPADDR
if [[ "$IPADDR" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then # ------------------------------------------------
# IP
# ------------------------------------------------
while true; do
read_tty "Endereço IPv4: " IPADDR
if valid_ipv4 "$IPADDR"; then
break break
fi fi
echo "Endereço IPv4 inválido." echo "Endereço IPv4 inválido."
done done
# ------------------------------------------------
# PREFIXO
# ------------------------------------------------
while true; do while true; do
read -rp "Prefixo da rede (ex.: 24): " PREFIX
read_tty "Prefixo da rede [ex.: 24]: " PREFIX
if [[ "$PREFIX" =~ ^[0-9]+$ ]] && if [[ "$PREFIX" =~ ^[0-9]+$ ]] &&
[ "$PREFIX" -ge 0 ] && [ "$PREFIX" -ge 0 ] &&
[ "$PREFIX" -le 32 ]; then [ "$PREFIX" -le 32 ]; then
break break
fi fi
echo "Prefixo inválido. Informe um valor entre 0 e 32." echo "Prefixo inválido. Informe um valor entre 0 e 32."
done done
echo # ------------------------------------------------
read -rp "Gateway [ENTER para nenhum]: " GATEWAY # GATEWAY
# ------------------------------------------------
echo while true; do
read -rp "Servidor(es) DNS separados por espaço [ENTER para nenhum]: " DNS
echo read_tty "Gateway [ENTER para nenhum]: " GATEWAY
read -rp "Domínio de pesquisa DNS [$NEW_DOMAIN]: " DNS_SEARCH
if [ -z "$GATEWAY" ]; then
break
fi
if valid_ipv4 "$GATEWAY"; then
break
fi
echo "Gateway inválido."
done
# ------------------------------------------------
# DNS
# ------------------------------------------------
while true; do
read_tty "DNS [ex.: 172.16.0.2 8.8.8.8] [ENTER para nenhum]: " DNS
if [ -z "$DNS" ]; then
break
fi
DNS_VALID=1
for DNS_IP in $DNS; do
if ! valid_ipv4 "$DNS_IP"; then
DNS_VALID=0
break
fi
done
if [ "$DNS_VALID" -eq 1 ]; then
break
fi
echo "Um ou mais servidores DNS são inválidos."
done
# ------------------------------------------------
# DNS SEARCH
# ------------------------------------------------
read_tty "Domínio de pesquisa DNS [$NEW_DOMAIN]: " DNS_SEARCH
if [ -z "$DNS_SEARCH" ]; then if [ -z "$DNS_SEARCH" ]; then
DNS_SEARCH="$NEW_DOMAIN" DNS_SEARCH="$NEW_DOMAIN"
fi fi
# ------------------------------------------------
# GRAVA INTERFACE
# ------------------------------------------------
cat >> /etc/network/interfaces <<EOF cat >> /etc/network/interfaces <<EOF
# ------------------------------------------------------------ # ------------------------------------------------------------
@@ -268,16 +460,22 @@ EOF
;; ;;
# ====================================================
# NÃO CONFIGURAR
# ====================================================
3) 3)
echo echo
echo "$IFACE não será configurada." echo "$IFACE não será adicionada ao /etc/network/interfaces."
break break
;; ;;
*) *)
echo
echo "Opção inválida." echo "Opção inválida. Escolha 1, 2 ou 3."
;; ;;
esac esac
@@ -288,7 +486,14 @@ done
# ============================================================ # ============================================================
# MOSTRA CONFIGURAÇÃO FINAL # PERMISSÕES
# ============================================================
chmod 644 /etc/network/interfaces
# ============================================================
# MOSTRA RESULTADO
# ============================================================ # ============================================================
echo echo
@@ -311,10 +516,24 @@ cat /etc/network/interfaces
echo echo
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
echo
# ============================================================ # ============================================================
# LIMPA HISTÓRICO # 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
@@ -322,25 +541,33 @@ echo "Limpando históricos..."
# ------------------------------------------------------------ # ------------------------------------------------------------
# Root # Histórico do root
# ------------------------------------------------------------ # ------------------------------------------------------------
history -c 2>/dev/null || true history -c 2>/dev/null || true
rm -f /root/.bash_history rm -f /root/.bash_history
rm -f /root/.zsh_history rm -f /root/.zsh_history
rm -f /root/.python_history
rm -f /root/.lesshst
rm -f /root/.wget-hsts
# ------------------------------------------------------------ # ------------------------------------------------------------
# Outros usuários # Usuários normais
# ------------------------------------------------------------ # ------------------------------------------------------------
while IFS=: read -r USERNAME _ UID _ _ HOME_DIR SHELL; do while IFS=: read -r USERNAME PASSWORD UID GID GECOS HOME_DIR SHELL; do
if [ "$UID" -ge 1000 ] && [ -d "$HOME_DIR" ]; then if [ "$UID" -ge 1000 ] &&
[ "$UID" -lt 65534 ] &&
[ -d "$HOME_DIR" ]; then
rm -f "$HOME_DIR/.bash_history" rm -f "$HOME_DIR/.bash_history"
rm -f "$HOME_DIR/.zsh_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 fi
@@ -348,23 +575,22 @@ done < /etc/passwd
# ------------------------------------------------------------ # ------------------------------------------------------------
# Remove histórico da sessão atual # Evita regravar o histórico desta sessão
# ------------------------------------------------------------ # ------------------------------------------------------------
unset HISTFILE unset HISTFILE
export HISTFILE=/dev/null export HISTFILE=/dev/null
# ============================================================ # ============================================================
# SINCRONIZA DISCO # SINCRONIZA ALTERAÇÕES
# ============================================================ # ============================================================
sync sync
# ============================================================ # ============================================================
# RESULTADO # FINALIZAÇÃO
# ============================================================ # ============================================================
echo echo
@@ -375,10 +601,15 @@ echo
echo "Hostname : $NEW_HOSTNAME" echo "Hostname : $NEW_HOSTNAME"
echo "FQDN : $FQDN" echo "FQDN : $FQDN"
echo echo
echo "A configuração de rede foi recriada do zero." echo "Rede configurada em:"
echo "/etc/network/interfaces"
echo echo
echo "A máquina será desligada." echo "Históricos removidos."
echo echo
echo "Desligando a máquina..."
echo
sleep 3
# ============================================================ # ============================================================