#!/bin/bash
#
# 定义作者和获取当前日期
# Copyright (c) [2025年5月] [流影]
#
# This script is licensed under the [GPL]
#
# Description: [本shell脚本是用来通过netplan去修改ubuntu22.04的网卡地址]


echo "###########################################################"
echo "#File Name: set_ip.sh"
echo "#Author: 流影"
echo "#Created Time: 2025-5-20"
echo "#Description: 使用netplan设置ubuntu22.04的IP地址"
echo "#Env: ubuntu22.04 Kernel6.1.84"
echo "#Version: 2.0"
echo "###########################################################"
#AUTHOR="Liuying"

#DATE=$(date +"%Y-%m-%d")

# 打印信息
#echo "This script was created by $AUTHOR on $DATE."
printf "\n"

echo "========================================"
echo "请选择你要修改的网卡(输入对应的数字就行):"
echo "0)eth0"
echo "1)eth1"
echo "========================================"

# eth输入合法性检测
while [ 1 -eq 1 ]
do
    read -p "请选择你要编辑的网卡:" eth
    echo "========================================"
    if  [ $eth -eq 1 ] || [ $eth -eq 0 ];then
        break
    else
	echo "输入有误请重新输入,请输入以下的数字序号:"
        echo "0)eth0"
        echo "1)eth1"
        echo "========================================"
    fi
done
# IP地址输入合法性检测
while [ 1 -eq 1 ]
do
    read -p "请输入你要设置的IP地址(格式:192.168.1.1/24):" ip
    
    # 使用正则表达式匹配IP地址合法性
    pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$"
    if [[ $ip =~ $pattern ]]; then
		echo "您设置eth$eth的IP地址为:$ip"
		echo "========================================"
        break
    else
        echo "IP地址不合法,请重新输入:"
		echo "========================================"
    fi
done

# 默认网关地址合法性检测
while [ 1 -eq 1 ]
do
	if [ -z "$gw" ];then
                echo
        else
                break
        fi

	echo "a)设置默认网关地址"
	echo "q)跳过"
	echo "========================================"
	read -p "请选择您要对默认网关进行的操作:" var
	case "$var" in
	a)
		while [ 1 -eq 1 ]
		do

		
			echo "========================================"
		
			read -p "请输入您要设置的默认网关地址(格式:192.168.1.1):" gw
		
			# 使用正则表达式匹配网关地址合法性
			pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
			if [[ $gw =~ $pattern ]]; then
				echo "您设置eth$eth的网关为:$gw"
				echo "========================================"
				break
			else
				echo "网关地址不合法,请重新输入:"
			fi
		done
		;;
	q)
		# 如果不设置网关默认使用IP地址
		if [ -z "$gw" ] # 判断变量是否存在,存在则为0不存在则为1
		then
			# 不存在使用IP地址替代
			gw=$(echo "$ip" | awk -v FS="/" '{print $1}')
			echo "已使用IP地址$gw作为网关"
		fi
		break
		;;
	*)
		
		echo "您输入的参数有误请重新输入"
		echo "========================================"
	esac
done




# DNS地址合法性检测
while [ 1 -eq 1 ]
do
	if [ -z "$dns" ];then
		echo
	else
		break
	fi

	echo "a)设置DNS地址"
	echo "q)跳过"
	echo "========================================"
	read -p "请选择您要对DNS进行的操作:" var
	case "$var" in
	a)
		while [ 1 -eq 1 ]
		do
			read -p "请输入你要设置的DNS地址(格式:8.8.8.8,114.114.114.114;写入多个dns地址请用英文逗号分割):" dns
			# 使用正则表达式匹配DNS地址合法性
			pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}(\,{1,10}([0-9]{1,3}\.){3}[0-9]{1,3}){0,10}$"
			if [[ $dns =~ $pattern ]]; then
				echo "您设置eth$eth的DNS为:$dns"
				echo "========================================"
				break
			else
				echo "DNS地址不合法,请重新输入:"
				echo "========================================"
			fi
		done	
		;;
	q)
		break
		;;
	*)
		echo "您输入的参数有误请重新输入"
		echo "========================================"
	esac
done



# 度量值合法性检测
while [ 1 -eq 1 ]
do
    read -p "请输入你要设置的开销(开销越小优先级越高,1-9999):" metric
    echo "========================================"
    # 使用正则表达式匹配度量值合法性
    pattern="^([0-9]{1,4})$"
    if [[ $metric =~ $pattern ]]; then
        break
    else
        echo "Metric不合法,请重新输入:"
    fi
done



# 配置文件示例


# 定义路径的全局变量
#path="/etc/netplan/"

# 判断原文件夹中是否存在配置文件,如果存在直接全部清空
#if test -e $path*.yaml
#  then
#    echo "正在清理旧配置文件!!!"
#    rm -f $path*.yaml
#    echo "重新创建配置文件$file"
#    touch $file
#  else
#    echo "配置文件不存在"
#
#    filename=eth$eth.yaml
#    file=$path$filename
#    echo "创建配置文件$file"
#    touch $file
#fi

# 定义路径的全局变量
path="/etc/netplan/"
# 查找所有yaml文件
#yaml=`ls $path | grep .yaml`
yaml=$(ls $path | grep eth$eth.yaml)
# 统计yaml文件数量,数量不为0则表明之前存在yaml文件
res=$(ls $path | grep .yaml | wc -l)
filename=eth$eth.yaml
file=$path$filename
# 判断原文件夹中是否存在配置文件,如果存在直接清空
if [ $res -ne 0 ]
  then
    echo "正在清理旧配置文件$yaml!!!"
    echo "========================================"
    rm -f $path$yaml
    echo "重新创建配置文件$file"
    echo "========================================"
    touch $file
  else
    echo "配置文件不存在"
    echo "========================================"
    echo "创建配置文件$file"
    echo "========================================"
    touch $file
fi


# 写入yaml文件
if [ $eth -eq 0 ]  # 写入eth0的配置文件
  then
    echo "Start write config file for eth$eth"	  
    echo "========================================"
    # 通过echo逐行追加写入到配置文件,eth0网卡
    echo "network:" >> $file
    echo "  ethernets:" >> $file
    echo "    eth$eth:" >> $file
    echo "      dhcp4: false" >> $file
    echo "      addresses: [$ip]" >> $file
    echo "      optional: true" >> $file
    echo "      routes:" >> $file
    echo "        - to: default" >> $file
    echo "          via: $gw" >> $file
    echo "          metric: $metric" >> $file
    echo "      nameservers:" >> $file
    echo "        addresses: [$dns]" >> $file
    echo "  version: 2" >> $file
    echo "Finish write config file for eth$eth"	  
    echo "========================================"
  else # 写入eth1网卡
    echo "Start write config file for eth$eth"	  
    echo "写入的文件是:$file"
    echo "========================================"
    touch $file
    cat << EOF > $file
network:
  ethernets:
    eth$eth:
      dhcp4: false
      addresses: [$ip]
      optional: true
      routes:
        - to: default
          via: $gw
          metric: $metric
      nameservers:
        addresses: [$dns]
  version: 2
EOF
    echo "Finish write config file for eth$eth"	  
    echo "========================================"
fi

f=error.txt
netplan apply  &> $path$f
if [ $? -eq 0 ];then
    echo "eth$eth地址修改成功!"
    echo "========================================"
    ipaddr=$(ifconfig eth$eth | grep -w "inet" | awk '{print $2}')
    echo "修改后的地址是:$ipaddr"
    echo "========================================"

else
    echo "eth$eth地址修改失败"
    echo "========================================"
    result=`cat $path$f`
    echo "失败原因是:$result"
    echo "========================================"
fi



# 写入DNS到/etc/resolv.conf
# 判断DNS是否正确,使用ping www.baidu.com
resp1=$(ping -c 1 "$gw" > /dev/null;echo $?)
resp2=$(ping -c 1 www.baidu.com > /dev/null;echo $?)
if [ $resp1 -eq 0 ];then
	echo -e "\033[43;30m 主机与网关$gw的通信是正常的 \033[0m"
	if [ $resp2 -eq 0 ];then
		echo "设备不能通过域名访问百度"
		while [ 1 -eq 1 ]
		do
			echo -e "\033[43;30m 是否尝试更新/etc/resolv.conf文件中的DNS服务器地址 \033[0m"
			echo "y)是"
			echo "n)否"
			echo "============================================"
			read -p "请选择:" var
			case "$var" in
				y)
					cp -a /etc/resolv.conf /etc/resolv_bak.conf
					cat /run/systemd/resolve/resolv.conf > /etc/resolv.conf
					echo "已更新/etc/resolv.conf文件"
					echo "更新后的内容如下:"
					echo "============================================"
					echo "$(cat /etc/resolv.conf | grep -w nameserver)"
					echo "============================================"
					bool=$(ping -c 1 www.baidu.com > /dev/null;echo $?)
					if [ $bool -eq 0 ];then break;fi
					;;
				n)
					break
					;;
				*)
					echo "参数输入错误请重新输入"
					echo "============================================"
			esac
		done
	fi
else
	echo "主机与网关$gw的通信断开的"
	echo "1)请检查设备网络配置是否正确"
	echo "2)请检查设备与网关的连接是否正常"
fi	

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐