Dateien nach "/" hochladen

This commit is contained in:
2026-09-26 12:10:41 +00:00
commit 150a8f9079
2 changed files with 443 additions and 0 deletions
+151
View File
@@ -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.
+292
View File
@@ -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" <<EOF
network:
version: 2
ethernets:
$INTERFACE:
dhcp4: false
addresses:
- $IP_ADDRESS/$PREFIX
routes:
- to: default
via: $GATEWAY
nameservers:
addresses: [$dns_yaml]
EOF
chmod 600 "$config_file"
echo
echo "Netplan-Datei erstellt:"
echo " $config_file"
echo
echo "Teste die Konfiguration..."
if command_exists netplan; then
netplan generate
echo
echo "WICHTIG:"
echo "Bei einer SSH-Verbindung kann die Verbindung nach dem Anwenden abbrechen."
echo
netplan apply
else
echo "Fehler: netplan-Befehl wurde nicht gefunden."
exit 1
fi
echo
echo "Statische IP wurde mit Netplan gesetzt."
}
show_result() {
echo
echo "Aktuelle Adressen auf $INTERFACE:"
ip -4 addr show dev "$INTERFACE" || true
echo
echo "Routing:"
ip route || true
echo
echo "Fertig."
}
clear
echo "====================================="
echo " Linux Static IP Configurator"
echo "====================================="
echo
select_interface
ask_network_data
if command_exists nmcli && nmcli general status >/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