zoukankan      html  css  js  c++  java
  • Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本

    转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07.

    运营商提供ipv6地址。
    路由器后有台linux机器,通过eui64方式自动配置ipv6地址。
    但是,运营商会定时强制路由器重拨,导致ipv6的前缀(prefix)变化。
    虽然linux会马上自动配置新的ipv6地址。但旧的ipv6地址不会马上消失。
    旧ipv6需要等超时expired后才删除,有时要等2000多秒(30多分钟)。
    这段时间主机会有两个ipv6地址。如果不能正确找出新的ipv6地址去更新ddns,则这段时间无法访问主机。

    通过查看 ip addr show 发现每个ip后面一行给出了expired时间。
    新ip的expired时间总是比旧ip大。这样就可以找出最新的ipv6地址了。

    以下是shell脚本,会显示出ipv4地址,和最新的ipv6(eui64)地址。

    #!/bin/sh
    ip addr show|grep -A1 'inet [^f:]'|sed -nr 's#^ +inet ([0-9.]+)/[0-9]+ brd [0-9./]+ scope global .*#1#p'
    ip addr show|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#2 1#p;ta'|grep 'ff:fe'|sort -nr|head -n1|cut -d' ' -f2
    

    显示ipv6的脚本执行步骤是,

    • ip addr show
    • 去除 deprecated 地址
    • 挑出inet6地址,并同时显示下一行
    • 把expired时间和ipv6地址,通过正则找出来,并显示在同一行。超时时间在前,ip在后。
    • 过滤出eui64地址
    • 根据时间的长短,反向排序
    • 输出第一行
    • 输出第二列(ip)

    如果要把这个地址保存到变量,用来更新ddns,就这样写。

    #!/bin/sh
    ipv4=$(ip addr show|grep -A1 'inet [^f:]'|sed -nr 's#^ +inet ([0-9.]+)/[0-9]+ brd [0-9./]+ scope global .*#1#p')
    ipv6=$(ip addr show|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#2 1#p;ta'|grep 'ff:fe'|sort -nr|head -n1|cut -d' ' -f2)
    #echo "my ipv6 is:" $ipv6
    # 如果路由器有公网ipv4,可以让ddns根据来源ip自动检测
    wget --no-check-certificate -q -O - 'https://ipv4.dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4=auto&ipv6='$ipv6
    

    python3 的脚本例子。

    #!/usr/bin/python3
    # -*- coding: utf-8 -*- #
    
    import urllib.request
    import ssl
    import subprocess
    import re
    
    def getIP():
       #interface='eth0'
       interface=''
       output=subprocess.getoutput('/sbin/ip addr show '+interface+'|grep -v deprecated')
       ipv4=re.findall(r' inet ([d.]+)/(d+) brd [d./]+ scope global ',output,re.M|re.I)
       ipv6=re.findall(r' inet6 ([^f:][da-f:]+)/(d+) scope global .+?
    .+? valid_lft (d+)sec ',output,re.M|re.I)
    
       # eui64的ipv6地址按超时时间排序,其他的排前面
       def my_key(a):
          if a[0].find('ff:fe')>4:
             return int(a[2])
          else:
             return -1
       ipv6.sort(key=my_key,reverse=True) #反向排序
       #print('ipv4=',ipv4)
       #print('ipv6=',ipv6)
    
       return (ipv4,ipv6)
    
    def updateddns(ipv4,ipv6):
       context = ssl._create_unverified_context()
       opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context)) #不验证证书
       header={
           'Accept':'*/*',
           'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
           'Accept-Encoding':'none',
       }
       #host='https://dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4='+ipv4+'&ipv6='+ipv6
       #如果路由器有公网ipv4,可以让ddns根据来源ip自动检测
       host='https://ipv4.dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4=auto&ipv6='+ipv6
       req=urllib.request.Request(host, b'',header)
       content=opener.open(req, timeout=20)
       print(content.read().decode('utf8'))
       return True
    
    if __name__=='__main__':
       ipv4,ipv6=getIP()
       updateddns(ipv4[0][0],ipv6[0][0])
    

    这个是OpenWRT路由器中的lua脚本。

    如果你的路由器是OpenWRT,可以用这个脚本直接跑在路由器中。
    这个脚本获取的是路由器本身的ipv4和ipv6(非eui64).

    #!/usr/bin/lua
    
    require("luci.sys")
    local a=luci.sys.exec('/sbin/ip addr show pppoe-wan')
    local ipv4=string.match(a," inet ([%d%.]+) peer ")
    local ipv6=string.match(a," inet6 ([%a%d:]+)/[0-9]+ scope global ")
    -- lua的注释为两个减号
    --print(ipv4,ipv6)
    
    cc=luci.sys.exec("/bin/wget --no-check-certificate -q -O - 'https://dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4="..ipv4.."&ipv6="..ipv6.."'")
    

    ---end---

    转载注明来源: 本文链接 来自osnosn的博客

  • 相关阅读:
    javaWeb总结——session
    javaWeb中servlet开发——过滤器
    参数化测试
    JUnit 4中元数据的用法
    appium常用方法
    appium查看控件的方法
    appium+java+testng+maven环境搭建
    java-appium自动化测试之DesiredCapabilities
    GitHub 标星 15.3k,Java 编程思想最新中文版(On Java 8)
    【成功上岸】2年半开发经验进入梦寐以求的京东上班,附上我的上岸经验希望帮助到大家!
  • 原文地址:https://www.cnblogs.com/osnosn/p/11813096.html
Copyright © 2011-2022 走看看