619 lines
14 KiB
Bash
619 lines
14 KiB
Bash
#!/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 <<EOF
|
|
127.0.0.1 localhost
|
|
127.0.1.1 $FQDN $NEW_HOSTNAME
|
|
|
|
::1 localhost ip6-localhost ip6-loopback
|
|
ff02::1 ip6-allnodes
|
|
ff02::2 ip6-allrouters
|
|
EOF
|
|
|
|
|
|
# ============================================================
|
|
# DETECTA INTERFACES
|
|
# ============================================================
|
|
|
|
echo
|
|
echo "============================================================"
|
|
echo " INTERFACES DE REDE ENCONTRADAS"
|
|
echo "============================================================"
|
|
echo
|
|
|
|
mapfile -t INTERFACES < <(
|
|
find /sys/class/net \
|
|
-mindepth 1 \
|
|
-maxdepth 1 \
|
|
-printf '%f\n' |
|
|
grep -v '^lo$' |
|
|
sort
|
|
)
|
|
|
|
|
|
if [ "${#INTERFACES[@]}" -eq 0 ]; then
|
|
echo "ERRO: nenhuma interface de rede encontrada."
|
|
exit 1
|
|
fi
|
|
|
|
|
|
for IFACE in "${INTERFACES[@]}"; do
|
|
|
|
MAC="desconhecido"
|
|
STATE="desconhecido"
|
|
|
|
if [ -f "/sys/class/net/$IFACE/address" ]; then
|
|
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
|
|
|
|
done
|
|
|
|
|
|
# ============================================================
|
|
# RECRIA /etc/network/interfaces
|
|
# ============================================================
|
|
|
|
echo "Recriando /etc/network/interfaces..."
|
|
|
|
cat > /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 <<EOF
|
|
|
|
# ------------------------------------------------------------
|
|
# Interface $IFACE - DHCP
|
|
# ------------------------------------------------------------
|
|
|
|
auto $IFACE
|
|
allow-hotplug $IFACE
|
|
iface $IFACE inet dhcp
|
|
|
|
EOF
|
|
|
|
echo
|
|
echo "$IFACE configurada como DHCP."
|
|
|
|
break
|
|
;;
|
|
|
|
|
|
# ====================================================
|
|
# ESTÁTICO
|
|
# ====================================================
|
|
|
|
2)
|
|
|
|
echo
|
|
echo "Configuração estática de $IFACE"
|
|
echo
|
|
|
|
|
|
# ------------------------------------------------
|
|
# IP
|
|
# ------------------------------------------------
|
|
|
|
while true; do
|
|
|
|
read_tty "Endereço IPv4: " IPADDR
|
|
|
|
if valid_ipv4 "$IPADDR"; then
|
|
break
|
|
fi
|
|
|
|
echo "Endereço IPv4 inválido."
|
|
|
|
done
|
|
|
|
|
|
# ------------------------------------------------
|
|
# PREFIXO
|
|
# ------------------------------------------------
|
|
|
|
while true; do
|
|
|
|
read_tty "Prefixo da rede [ex.: 24]: " PREFIX
|
|
|
|
if [[ "$PREFIX" =~ ^[0-9]+$ ]] &&
|
|
[ "$PREFIX" -ge 0 ] &&
|
|
[ "$PREFIX" -le 32 ]; then
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
echo "Prefixo inválido. Informe um valor entre 0 e 32."
|
|
|
|
done
|
|
|
|
|
|
# ------------------------------------------------
|
|
# GATEWAY
|
|
# ------------------------------------------------
|
|
|
|
while true; do
|
|
|
|
read_tty "Gateway [ENTER para nenhum]: " GATEWAY
|
|
|
|
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
|
|
DNS_SEARCH="$NEW_DOMAIN"
|
|
fi
|
|
|
|
|
|
# ------------------------------------------------
|
|
# GRAVA INTERFACE
|
|
# ------------------------------------------------
|
|
|
|
cat >> /etc/network/interfaces <<EOF
|
|
|
|
# ------------------------------------------------------------
|
|
# Interface $IFACE - ESTÁTICA
|
|
# ------------------------------------------------------------
|
|
|
|
auto $IFACE
|
|
allow-hotplug $IFACE
|
|
iface $IFACE inet static
|
|
address $IPADDR/$PREFIX
|
|
EOF
|
|
|
|
|
|
if [ -n "$GATEWAY" ]; then
|
|
echo " gateway $GATEWAY" >> /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 |