Dateien nach "/" hochladen
This commit is contained in:
@@ -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.
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user