#!/bin/bash # bj-network — постоянный адрес сервера bj (на консоли сервера, под sudo). Ubuntu (netplan): спрашивает # адрес, шлюз и DNS и применяет через «netplan try» — если связь пропала и подтверждения нет 120 секунд, # прежние настройки возвращаются сами. Запускается и при первой загрузке с образа (bj-firstboot). set -u [ "$(id -u)" = 0 ] || { echo "запустите через sudo: sudo bj-network"; exit 1; } command -v netplan >/dev/null || { echo "netplan не найден: на этой системе сеть настраивается её средствами (/etc/network/interfaces)."; exit 1; } IF=$(ip -4 route show default 2>/dev/null | awk '{print $5; exit}') [ -n "$IF" ] || IF=$(ip -o link show | awk -F': ' '$2!="lo"{print $2; exit}') CUR=$(ip -4 -o addr show dev "$IF" scope global 2>/dev/null | awk '{print $4; exit}') GW=$(ip -4 route show default 2>/dev/null | awk '{print $3; exit}') DNS=$(resolvectl dns "$IF" 2>/dev/null | sed 's/.*: *//' | tr ' ' ',' ) printf '\n Сеть сервера: интерфейс %s, адрес %s, шлюз %s, DNS %s\n' "$IF" "${CUR:-нет}" "${GW:-нет}" "${DNS:-нет}" printf ' Постоянный адрес нужен, чтобы адрес bj не менялся (DHCP может выдать другой).\n\n' ask() { local v; read -r -p " $1 [$2]: " v; printf '%s' "${v:-$2}"; } ADDR=$(ask "Адрес с маской (например 10.10.10.30/24)" "${CUR:-}") [[ "$ADDR" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}/[0-9]{1,2}$ ]] || { echo " адрес — вида 10.10.10.30/24"; exit 1; } GW2=$(ask "Шлюз" "${GW:-}") [[ "$GW2" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || { echo " шлюз — вида 10.10.10.1"; exit 1; } DNS2=$(ask "DNS через запятую" "${DNS:-$GW2}") F=/etc/netplan/60-bj-static.yaml [ -f "$F" ] && cp -a "$F" "$F.bak" { printf 'network:\n version: 2\n ethernets:\n %s:\n dhcp4: false\n addresses: [%s]\n routes:\n - to: default\n via: %s\n nameservers:\n addresses: [%s]\n' "$IF" "$ADDR" "$GW2" "$DNS2" } > "$F" chmod 600 "$F" # прежние файлы с DHCP для этого интерфейса — выключаем, чтобы не было двух адресов for f in /etc/netplan/*.yaml; do [ "$f" = "$F" ] && continue; grep -q "$IF" "$f" 2>/dev/null && mv "$f" "$f.disabled-by-bj"; done # на Ubuntu с образа сетью управляет cloud-init: без запрета при перезагрузке он может вернуть DHCP CI=/etc/cloud/cloud.cfg.d/99-bj-disable-network-config.cfg [ -d /etc/cloud/cloud.cfg.d ] && printf 'network: {config: disabled}\n' > "$CI" echo " Применяю. Если связь пропадёт — через 120 секунд вернутся прежние настройки." if netplan try --timeout 120; then echo " ✓ Адрес ${ADDR%/*} закреплён. Веб-вход: https://${ADDR%/*}:8443/" [ -x /usr/local/sbin/bj-welcome ] && /usr/local/sbin/bj-welcome else for f in /etc/netplan/*.disabled-by-bj; do [ -f "$f" ] && mv "$f" "${f%.disabled-by-bj}"; done rm -f "$F" "$CI"; netplan apply; echo " Настройки не приняты — оставлен прежний адрес." fi