【BASH】Ubuntu保存当前IPv4信息到netplan配置文件

#!/usr/bin/env bash
## coding=utf-8
##==================================----------==================================
## FILE: n5n_ubt.sh
## MYPG: abldg, https://github.com/abldg
## LSCT: 2025-04-22 21:06:44
## VERS: 1.4
##==================================----------==================================
dfn_cfgs4ntwk() {
  ###///////////////////////////////////////////////////////////////////////////
  xf_get_br_first_child() {
    set -- $1 /sys/class/net/$1/brif
    if [ -e $2 ]; then ##is-a-bridge
      local tbr=/sys/devices/virtual/net/${1} xif= rst=
      for xif in $(ls -d1 /sys/class/net/[^lvb]*); do
        if [ "$tbr" == "$(realpath $xif/master)" ]; then
          rst="${rst} ${xif##*/}"
        fi
      done 2>/dev/null
      set -- $(echo ${rst} | xargs -n1 | sort | grep -v 'tap' | head -1)
    fi
    echo $1
  }
  ###///////////////////////////////////////////////////////////////////////////
  xf_get_ifn_ip_brd_prefix() {
    local xt_i4pa='.[]|.addr_info[0]|.local,.broadcast,.prefixlen'
    set -- $(ip -4 -j addr show $1 | jq "${xt_i4pa}" | xargs)
    local cip=$1 brd=$2 pfx=$3
    ##SHV_RESET_IP-not-empty-then-merge-it-into-cip
    { local t= && set -- ${SHV_RESET_IP//./ }; } 2>/dev/null
    case $# in
    4) t= ;;
    0) t=${cip} ;;
    1) t=${cip%.*}. ;;
    2) t=${cip%.*.*}. ;;
    3) t=${cip%%.*}. ;;
    *) t=$1.$2.$3.$4 && SHV_RESET_IP= ;;
    esac
    cip=${t}$SHV_RESET_IP
    echo ${cip} ${pfx} ${cip##*.}
  }
  ###///////////////////////////////////////////////////////////////////////////
  xf_upt_hostname_and_hosts() {
    [ X = X${SHV_RESET_HN} ] && return
    ##arg1: ipv4address
    mt_tipstep
    set -- $ADRINFO ${ADRINFO//./-} ${SHV_RESET_HN} /etc/hosts
    local newhn=${2}
    [ X1 != X$3 ] && newhn=$3
    sudo hostnamectl set-hostname $newhn
    sed -i -r '/^#NEWAPD#$/,${d}' $4
    echo -e "#NEWAPD#\n$1 $newhn" | sudo tee -a $4
  }
  ###///////////////////////////////////////////////////////////////////////////
  xf_upt_npyaml() {
    ##via-outter-vars: (ADRINFO),GWIFN,GWIP
    {
      ##
      local yfhead='network:
      #TDL#  version: 2
      #TDL#  ethernets:
      #TDL#    #ethX: { dhcp4: no, dhcp6: no, addresses: [ RV_CIDR_SPL ] }
      #TDL#    RV_TKN:'
      local yffoot='
      #TDL#      dhcp4: no
      #TDL#      dhcp6: no
      #TDL#      addresses:
      #TDL#      - RV_CIDR_USE
      #TDL#      routes:
      #TDL#      - { metric: 100, to: 0.0.0.0/0, via: RV_GWIP }
      #TDL#      nameservers:
      #TDL#        addresses: [ 223.5.5.5, 114.114.114.114, 8.8.8.8 ]'
      local yfbody=
      if [ ${#SHV_N5N_USE_BR} -ne 0 ]; then
        yfbody=' { dhcp4: no, dhcp6: no }
        #TDL#  bridges:
        #TDL#    '${SHV_N5N_USE_BR}':
        #TDL#      interfaces:
        #TDL#      - RV_TKN'
      fi
      ##
      set -- ${ADRINFO[@]}
      set -- ${GWIFN} ${GWIP} $1/$2 192.168.166.$3/$2
      local sexps=(
        -e "s@RV_TKN@${1}@g"
        -e "s@RV_GWIP@${2}@"
        -e "s@RV_CIDR_USE@${3}@g"
        -e "s@RV_CIDR_SPL@${4}@g"
        -e "s@\s+#TDL#@@g"
      )
      echo "${yfhead}${yfbody}${yffoot}" | sed -r ${sexps[@]} >/tmp/x2x
    } 2>/dev/null
    ##
    set -- /etc/netplan /tmp/x2x
    [ -e $2 ] && {
      sudo rm -rf $1/*.yaml 2>/dev/null
      sudo install -m 0600 $2 $1/00-static.yaml
    }
  }
  ###///////////////////////////////////////////////////////////////////////////
  ##save-ntwkinfo-into-a-file (ubuntu:/etc/netplan/00-static, oe: ifcfg-xxx)
  ## GLV::SHV_RESET_IP change-into-a-newipv4
  ## GLV::SHV_RESET_HN change-hostname(SHV_RESET_HN=1,newhn=${ip4//./-})
  ##get-gateway-ipv4-address-and-via-interface
  set -- $(ip -4 -j route show default | jq '.[0]|.gateway,.dev' | xargs)
  local ADRINFO= GWIFN= GWIP=$1
  ##get-real-ifn-begins-with-eXXX
  GWIFN=$(xf_get_br_first_child $2)
  ##get-the-ipv4-on-gateway-via-interface
  ADRINFO=($(xf_get_ifn_ip_brd_prefix $2))
  # echo ${ADRINFO[@]}
  ##
  xf_upt_hostname_and_hosts
  ##
  set -- /usr/sbin/netplan
  [ -x $1 ] && (xf_upt_npyaml)
}
dfn_cfgs4ntwk
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值