【脚本】设置 Ubuntu IP 静态地址


cat > set-static-ip.sh << 'EOF'
#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then 
    echo -e "${RED}请使用 root 权限运行此脚本${NC}"
    exit 1
fi

# 获取网络接口列表
get_interfaces() {
    ip link show | grep -E '^[0-9]+: ' | grep -v 'lo:' | cut -d: -f2 | tr -d ' '
}

# 显示当前网络接口
echo -e "${YELLOW}可用的网络接口:${NC}"
mapfile -t INTERFACES < <(get_interfaces)
for i in "${!INTERFACES[@]}"; do
    current_ip=$(ip addr show ${INTERFACES[i]} | grep "inet " | awk '{print $2}')
    echo "$((i+1)). ${INTERFACES[i]} ${current_ip:+(当前IP: $current_ip)}"
done

# 选择网络接口
echo -e "\n${YELLOW}请选择要配置的网络接口 (1-${#INTERFACES[@]}):${NC}"
read -r selection

# 验证输入
if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt "${#INTERFACES[@]}" ]; then
    echo -e "${RED}无效的选择${NC}"
    exit 1
fi

INTERFACE="${INTERFACES[$((selection-1))]}"

# 获取当前网络信息作为默认值
CURRENT_IP=$(ip addr show $INTERFACE | grep "inet " | awk '{print $2}' | cut -d/ -f1)
CURRENT_PREFIX=$(ip addr show $INTERFACE | grep "inet " | awk '{print $2}' | cut -d/ -f2)
CURRENT_GATEWAY=$(ip route | grep default | awk '{print $3}' | head -n 1)
CURRENT_DNS="114.114.114.114,8.8.8.8,223.5.5.5"

# 获取用户输入
echo -e "${YELLOW}请输入静态IP地址 (例如: 192.168.1.100)${NC} [${GREEN}$CURRENT_IP${NC}]: "
read -r IP_ADDR
IP_ADDR=${IP_ADDR:-$CURRENT_IP}

echo -e "${YELLOW}请输入子网掩码前缀 (例如: 24 表示 255.255.255.0)${NC} [${GREEN}$CURRENT_PREFIX${NC}]: "
read -r PREFIX
PREFIX=${PREFIX:-$CURRENT_PREFIX}

echo -e "${YELLOW}请输入网关地址${NC} [${GREEN}$CURRENT_GATEWAY${NC}]: "
read -r GATEWAY
GATEWAY=${GATEWAY:-$CURRENT_GATEWAY}

echo -e "${YELLOW}请输入DNS服务器 (多个用逗号分隔,例如: 114.114.114.114,8.8.8.8)${NC} [${GREEN}$CURRENT_DNS${NC}]: "
read -r DNS_SERVERS
DNS_SERVERS=${DNS_SERVERS:-$CURRENT_DNS}

# 格式化DNS服务器字符串
DNS_SERVERS=$(echo $DNS_SERVERS | tr ',' ' ' | sed 's/[[:space:]]*$//')

# 确认设置
echo -e "\n${YELLOW}请确认以下设置:${NC}"
echo -e "接口: ${GREEN}$INTERFACE${NC}"
echo -e "IP地址: ${GREEN}$IP_ADDR/${PREFIX}${NC}"
echo -e "网关: ${GREEN}$GATEWAY${NC}"
echo -e "DNS服务器: ${GREEN}$DNS_SERVERS${NC}"
echo -e "\n${YELLOW}是否确认这些设置? (y/n)${NC}"
read -r confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
    echo -e "${RED}操作已取消${NC}"
    exit 1
fi

# 备份当前配置
NETPLAN_FILE="/etc/netplan/01-netcfg.yaml"
if [ -f "$NETPLAN_FILE" ]; then
    cp "$NETPLAN_FILE" "$NETPLAN_FILE.backup.$(date +%Y%m%d_%H%M%S)"
fi

# 转换DNS服务器为YAML格式
DNS_YAML=$(echo $DNS_SERVERS | tr ' ' '\n' | sed 's/^/            - /')

# 创建新的netplan配置
cat > "$NETPLAN_FILE" << YAML
network:
  version: 2
  renderer: networkd
  ethernets:
    $INTERFACE:
      dhcp4: no
      addresses:
        - $IP_ADDR/$PREFIX
      gateway4: $GATEWAY
      nameservers:
        addresses:
$(echo "$DNS_YAML")
YAML

# 应用新配置
echo -e "${YELLOW}正在应用网络配置...${NC}"
if netplan try; then
    netplan apply
    echo -e "${GREEN}网络配置已成功应用${NC}"
    
    # 显示新的网络配置
    echo -e "\n${YELLOW}新的网络配置:${NC}"
    ip addr show $INTERFACE | grep inet
    ip route | grep default
    echo -e "\nDNS 服务器:"
    cat /etc/resolv.conf | grep nameserver
else
    echo -e "${RED}配置应用失败,正在回滚...${NC}"
    if [ -f "$NETPLAN_FILE.backup" ]; then
        cp "$NETPLAN_FILE.backup" "$NETPLAN_FILE"
        netplan apply
    fi
    exit 1
fi
EOF

# 添加执行权限
chmod +x set-static-ip.sh

如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录