ubuntu22.04使用netplan设置ip shell脚本
·
#!/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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)