#!/usr/bin/env bash
# =============================================================================
# set_static_ip.sh — задаёт статический IP на сетевом интерфейсе через netplan
#
# ИСПОЛЬЗОВАНИЕ:
# sudo bash set_static_ip.sh <IP> [интерфейс] [шлюз] [DNS]
#
# ПРИМЕРЫ:
# sudo bash set_static_ip.sh 192.168.1.50
# → IP: 192.168.1.50/24, интерфейс: первый найденный, шлюз: .1
#
# sudo bash set_static_ip.sh 192.168.1.50 eth0 192.168.1.1 8.8.8.8
# → все параметры заданы явно
#
# ТРЕБОВАНИЯ: Ubuntu/Debian с netplan, запуск от root (sudo)
# =============================================================================
set -euo pipefail
# --- проверка прав ---
if [[ $EUID -ne 0 ]]; then
echo "Ошибка: запустите скрипт через sudo" >&2
exit 1
fi
# --- проверка аргументов ---
if [[ $# -lt 1 ]]; then
echo "Использование: sudo bash $0 <IP> [интерфейс] [шлюз] [DNS]"
echo "Пример: sudo bash $0 192.168.1.50"
exit 1
fi
DESIRED_IP="$1"
# --- определяем параметры сети ---
# Берём подсеть /24 и вычисляем шлюз (.1) из IP, если не заданы явно
NETWORK_PREFIX=$(echo "$DESIRED_IP" | cut -d. -f1-3)
IFACE=${2:-$(ip -o link show | awk -F': ' '$2 !~ /^lo$/ {print $2; exit}')}
GATEWAY=${3:-"${NETWORK_PREFIX}.1"}
DNS=${4:-"8.8.8.8"}
MASK="/24"
echo "→ Интерфейс : $IFACE"
echo "→ IP : ${DESIRED_IP}${MASK}"
echo "→ Шлюз : $GATEWAY"
echo "→ DNS : $DNS"
echo
# --- путь к конфигу netplan ---
NETPLAN_FILE="/etc/netplan/99-static-ip.yaml"
# --- создаём конфиг ---
cat > "$NETPLAN_FILE" <<EOF
network:
version: 2
renderer: networkd
ethernets:
${IFACE}:
dhcp4: false
addresses:
- ${DESIRED_IP}${MASK}
routes:
- to: default
via: ${GATEWAY}
nameservers:
addresses:
- ${DNS}
- 1.1.1.1
EOF
echo "✓ Конфиг записан в $NETPLAN_FILE"
# --- проверка синтаксиса перед применением ---
echo "Проверяем конфиг (netplan try)..."
netplan generate
# --- применяем ---
netplan apply
echo "✓ Настройки применены. Текущий IP на $IFACE:"
ip -4 addr show "$IFACE" | grep inet