From 150a8f9079e021429901c253ab6f5f7359796b1b Mon Sep 17 00:00:00 2001 From: Colin-Joel Scupin Date: Sat, 26 Sep 2026 12:10:41 +0000 Subject: [PATCH] Dateien nach "/" hochladen --- README.md | 151 ++++++++++++++++++++++++ set-static-ip.sh | 292 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 443 insertions(+) create mode 100644 README.md create mode 100644 set-static-ip.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..4043048 --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +# Linux Static IP Configurator + +Ein kleines Bash-Script zum interaktiven Setzen einer statischen IPv4-Adresse unter Linux. + +Unterstützt werden: + +- NetworkManager (`nmcli`) +- Netplan +- Ubuntu Desktop +- Ubuntu Server +- viele aktuelle Debian-/Ubuntu-basierte Systeme mit NetworkManager oder Netplan + +> Das Script verändert die Netzwerkkonfiguration des Systems. Bei einer SSH-Verbindung kann die Verbindung abbrechen, sobald die neue IP-Adresse aktiviert wird. + +## Dateien + +```text +set-static-ip.sh +README.md +``` + +## Installation + +Repository klonen oder die Datei `set-static-ip.sh` herunterladen. + +Danach das Script ausführbar machen: + +```bash +chmod +x set-static-ip.sh +``` + +## Verwendung + +Das Script benötigt Root-Rechte: + +```bash +sudo ./set-static-ip.sh +``` + +Danach: + +1. Netzwerkinterface auswählen, zum Beispiel `ens18`, `enp1s0` oder `eth0` +2. gewünschte IPv4-Adresse eingeben +3. CIDR-Präfix eingeben +4. Standard-Gateway eingeben +5. DNS-Server eingeben +6. Konfiguration bestätigen + +Beispiel: + +```text +IPv4-Adresse: 10.100.0.20 +CIDR-Präfix: 24 +Gateway: 10.100.0.1 +DNS: 10.100.0.10 1.1.1.1 +``` + +Das entspricht: + +```text +10.100.0.20/24 +``` + +## NetworkManager + +Wenn `nmcli` vorhanden und NetworkManager aktiv ist, verwendet das Script die vorhandene Verbindung des ausgewählten Netzwerkinterfaces. + +Falls keine passende Verbindung existiert, wird automatisch eine neue Verbindung angelegt. + +Vor der Änderung wird nach Möglichkeit ein Backup unter folgendem Pfad erstellt: + +```text +/root/network-backup-YYYYMMDD-HHMMSS/ +``` + +## Netplan + +Wenn Netplan verwendet wird, erstellt das Script: + +```text +/etc/netplan/99-static-ip.yaml +``` + +Vorhandene Netplan-Dateien werden vorher gesichert: + +```text +/root/netplan-backup-YYYYMMDD-HHMMSS/ +``` + +Anschließend werden ausgeführt: + +```bash +netplan generate +netplan apply +``` + +## Aktuelle IP prüfen + +```bash +ip addr +``` + +oder nur IPv4: + +```bash +ip -4 addr +``` + +Routing prüfen: + +```bash +ip route +``` + +## Hinweis zu IP-Konflikten + +Bevor eine statische IP vergeben wird, sollte geprüft werden, ob die Adresse bereits von einem anderen Gerät benutzt wird. + +Beispiel: + +```bash +ping 10.100.0.20 +``` + +Zusätzlich kann die ARP-/Neighbor-Tabelle geprüft werden: + +```bash +ip neigh +``` + +Am besten wird eine statische Adresse verwendet, die: + +- außerhalb des DHCP-Pools liegt, oder +- im DHCP-Server ausdrücklich für dieses Gerät reserviert wurde. + +Dadurch werden doppelte IP-Adressen im Netzwerk vermieden. + +## Unterstützte Systeme + +Das Script ist hauptsächlich für aktuelle Linux-Systeme gedacht, die eines dieser Netzwerk-Backends verwenden: + +```text +NetworkManager +Netplan +``` + +Klassische Debian-Systeme, die ausschließlich `/etc/network/interfaces` verwenden, werden aktuell nicht automatisch konfiguriert. + +## Lizenz + +Du kannst das Script für eigene Projekte frei verwenden und anpassen. diff --git a/set-static-ip.sh b/set-static-ip.sh new file mode 100644 index 0000000..e09e971 --- /dev/null +++ b/set-static-ip.sh @@ -0,0 +1,292 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Linux Static IP Configurator +# Supports: +# - NetworkManager (nmcli) +# - Netplan +# +# Run as root: +# sudo ./set-static-ip.sh + +if [[ "${EUID}" -ne 0 ]]; then + echo "Dieses Script muss als root ausgeführt werden." + echo "Bitte nutze: sudo $0" + exit 1 +fi + +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +pause() { + echo + read -r -p "Drücke Enter, um fortzufahren..." +} + +get_interfaces() { + ip -o link show | awk -F': ' '{print $2}' | grep -v '^lo$' +} + +select_interface() { + echo "Verfügbare Netzwerkinterfaces:" + echo + + mapfile -t interfaces < <(get_interfaces) + + if [[ "${#interfaces[@]}" -eq 0 ]]; then + echo "Keine Netzwerkinterfaces gefunden." + exit 1 + fi + + for i in "${!interfaces[@]}"; do + state=$(cat "/sys/class/net/${interfaces[$i]}/operstate" 2>/dev/null || echo "unknown") + echo " $((i + 1))) ${interfaces[$i]} [$state]" + done + + echo + while true; do + read -r -p "Interface auswählen [1-${#interfaces[@]}]: " choice + + if [[ "$choice" =~ ^[0-9]+$ ]] && + (( choice >= 1 && choice <= ${#interfaces[@]} )); then + INTERFACE="${interfaces[$((choice - 1))]}" + break + fi + + echo "Ungültige Auswahl." + done +} + +validate_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 >= 0 && octet <= 255 )) || return 1 + done + + return 0 +} + +validate_cidr() { + local cidr="$1" + [[ "$cidr" =~ ^[0-9]+$ ]] && (( cidr >= 0 && cidr <= 32 )) +} + +ask_network_data() { + echo + echo "Statische IPv4-Konfiguration" + echo "----------------------------" + + while true; do + read -r -p "IPv4-Adresse (z.B. 192.168.1.50): " IP_ADDRESS + validate_ipv4 "$IP_ADDRESS" && break + echo "Ungültige IPv4-Adresse." + done + + while true; do + read -r -p "CIDR-Präfix (z.B. 24): " PREFIX + validate_cidr "$PREFIX" && break + echo "Ungültiges CIDR-Präfix." + done + + while true; do + read -r -p "Gateway (z.B. 192.168.1.1): " GATEWAY + validate_ipv4 "$GATEWAY" && break + echo "Ungültiges Gateway." + done + + read -r -p "DNS-Server, mit Leerzeichen getrennt [1.1.1.1 8.8.8.8]: " DNS_INPUT + DNS_INPUT="${DNS_INPUT:-1.1.1.1 8.8.8.8}" + + DNS_SERVERS=() + for dns in $DNS_INPUT; do + if ! validate_ipv4 "$dns"; then + echo "Ungültiger DNS-Server: $dns" + exit 1 + fi + DNS_SERVERS+=("$dns") + done + + echo + echo "Gewählte Konfiguration:" + echo " Interface : $INTERFACE" + echo " IP-Adresse: $IP_ADDRESS/$PREFIX" + echo " Gateway : $GATEWAY" + echo " DNS : ${DNS_SERVERS[*]}" + echo + + read -r -p "Konfiguration anwenden? [j/N]: " confirm + case "${confirm,,}" in + j|ja|y|yes) + ;; + *) + echo "Abgebrochen." + exit 0 + ;; + esac +} + +configure_networkmanager() { + echo + echo "NetworkManager erkannt." + + local connection + connection=$(nmcli -t -f NAME,DEVICE connection show --active \ + | awk -F: -v iface="$INTERFACE" '$2 == iface {print $1; exit}') + + if [[ -z "$connection" ]]; then + connection=$(nmcli -t -f NAME,DEVICE connection show \ + | awk -F: -v iface="$INTERFACE" '$2 == iface {print $1; exit}') + fi + + if [[ -z "$connection" ]]; then + connection="static-$INTERFACE" + echo "Keine bestehende Verbindung gefunden." + echo "Erstelle NetworkManager-Verbindung: $connection" + + nmcli connection add \ + type ethernet \ + ifname "$INTERFACE" \ + con-name "$connection" + else + echo "Verwende Verbindung: $connection" + fi + + local backup_dir="/root/network-backup-$(date +%Y%m%d-%H%M%S)" + mkdir -p "$backup_dir" + + if [[ -d /etc/NetworkManager/system-connections ]]; then + cp -a /etc/NetworkManager/system-connections "$backup_dir/" 2>/dev/null || true + fi + + echo "Backup: $backup_dir" + + local dns_csv + dns_csv=$(IFS=,; echo "${DNS_SERVERS[*]}") + + nmcli connection modify "$connection" \ + ipv4.method manual \ + ipv4.addresses "$IP_ADDRESS/$PREFIX" \ + ipv4.gateway "$GATEWAY" \ + ipv4.dns "$dns_csv" \ + ipv4.ignore-auto-dns yes + + nmcli connection up "$connection" + + echo + echo "Statische IP wurde mit NetworkManager gesetzt." +} + +configure_netplan() { + echo + echo "Netplan erkannt." + + local backup_dir="/root/netplan-backup-$(date +%Y%m%d-%H%M%S)" + mkdir -p "$backup_dir" + cp -a /etc/netplan/. "$backup_dir/" 2>/dev/null || true + + echo "Backup: $backup_dir" + + local config_file="/etc/netplan/99-static-ip.yaml" + local dns_yaml="" + + for dns in "${DNS_SERVERS[@]}"; do + if [[ -n "$dns_yaml" ]]; then + dns_yaml+=", " + fi + dns_yaml+="$dns" + done + + cat > "$config_file" </dev/null 2>&1; then + configure_networkmanager +elif [[ -d /etc/netplan ]] && compgen -G "/etc/netplan/*.yaml" >/dev/null; then + configure_netplan +elif [[ -d /etc/netplan ]] && command_exists netplan; then + configure_netplan +else + echo + echo "Kein unterstütztes Netzwerk-Backend erkannt." + echo + echo "Unterstützt werden:" + echo " - NetworkManager / nmcli" + echo " - Netplan" + echo + echo "Bei Debian mit /etc/network/interfaces ist eine manuelle" + echo "Konfiguration erforderlich." + exit 1 +fi + +show_result