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)地址。

  1. #!/bin/sh
  2. ip addr show|grep -A1 'inet [^f:]'|sed -nr 's#^ +inet ([0-9.]+)/[0-9]+ brd [0-9./]+ scope global .*#\1#p'
  3. 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,就这样写。

  1. #!/bin/sh
  2. ipv4=$(ip addr show|grep -A1 'inet [^f:]'|sed -nr 's#^ +inet ([0-9.]+)/[0-9]+ brd [0-9./]+ scope global .*#\1#p')
  3. 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)
  4. #echo "my ipv6 is:" $ipv6
  5. # 如果路由器有公网ipv4,可以让ddns根据来源ip自动检测
  6. wget --no-check-certificate -q -O - 'https://ipv4.dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4=auto&ipv6='$ipv6

python3 的脚本例子。

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*- #
  3. import urllib.request
  4. import ssl
  5. import subprocess
  6. import re
  7. def getIP():
  8. #interface='eth0'
  9. interface=''
  10. output=subprocess.getoutput('/sbin/ip addr show '+interface+'|grep -v deprecated')
  11. ipv4=re.findall(r' inet ([\d.]+)/(\d+) brd [\d./]+ scope global ',output,re.M|re.I)
  12. ipv6=re.findall(r' inet6 ([^f:][\da-f:]+)/(\d+) scope global .+?\n.+? valid_lft (\d+)sec ',output,re.M|re.I)
  13. # eui64的ipv6地址按超时时间排序,其他的排前面
  14. def my_key(a):
  15. if a[0].find('ff:fe')>4:
  16. return int(a[2])
  17. else:
  18. return -1
  19. ipv6.sort(key=my_key,reverse=True) #反向排序
  20. #print('ipv4=',ipv4)
  21. #print('ipv6=',ipv6)
  22. return (ipv4,ipv6)
  23. def updateddns(ipv4,ipv6):
  24. context = ssl._create_unverified_context()
  25. opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context)) #不验证证书
  26. header={
  27. 'Accept':'*/*',
  28. '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)',
  29. 'Accept-Encoding':'none',
  30. }
  31. #host='https://dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4='+ipv4+'&ipv6='+ipv6
  32. #如果路由器有公网ipv4,可以让ddns根据来源ip自动检测
  33. host='https://ipv4.dynv6.com/api/update?hostname=myhostname.dynv6.net&token=mytoken.......mytoken&ipv4=auto&ipv6='+ipv6
  34. req=urllib.request.Request(host, b'',header)
  35. content=opener.open(req, timeout=20)
  36. print(content.read().decode('utf8'))
  37. return True
  38. if __name__=='__main__':
  39. ipv4,ipv6=getIP()
  40. updateddns(ipv4[0][0],ipv6[0][0])

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

如果你的路由器是OpenWRT,可以用这个脚本直接跑在路由器中。

这个脚本获取的是路由器本身的ipv4和ipv6(非eui64).

  1. #!/usr/bin/lua
  2. require("luci.sys")
  3. local a=luci.sys.exec('/sbin/ip addr show pppoe-wan')
  4. local ipv4=string.match(a," inet ([%d%.]+) peer ")
  5. local ipv6=string.match(a," inet6 ([%a%d:]+)/[0-9]+ scope global ")
  6. -- lua的注释为两个减号
  7. --print(ipv4,ipv6)
  8. 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的博客

Linux中获取本机的最新IPv6地址_更新ddns的脚本的更多相关文章

  1. ubuntu(Linux) c++ 获取本机IPv4和ipv6、查询本机IPv4,IPv6

    1.关于 演示环境: Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x ...

  2. Linux中获取本机网络信息的几个函数及应用

    一.读取/etc/hosts 几个函数 头文件<netdb.h> 1.void sethostent(int stayopen);//开打/etc/hosts 配置文件 2.struct ...

  3. linux编程获取本机网络相关参数

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

  4. Linux 获取本机IP、MAC地址用法大全

    getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...

  5. c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存

    我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...

  6. Linux下获取本机IP地址的代码

    Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...

  7. shell中获取本机ip地址

    shell中获取本机ip地址 方法一: /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr ...

  8. 获取本机IP、mac地址、计算机名

    python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid ...

  9. js获取本机的网络IP地址

    JavaScript是一门脚本语言,是不能操作文件,读取本地信息的,所以想要获取IP,还需要借助后端技术.方法如下: //获取本机的网络ip地址 function jsonpCallback(res) ...

随机推荐

  1. C语言I作业11

    C语言 博客作业11 问题 回答 C语言程序设计II 博客作业11 这个作业要求在哪里 作业要求 我在这个课程的目标是 理解和弄懂局部变量和全局变量,静态变量和动态变量 这个作业在哪个具体方面帮助我实 ...

  2. 【SSL1455&1456】 电子老鼠闯迷宫 & 骑士游行

    考点概况: 广搜板子 题面: \[\Large\text{电子老鼠闯迷宫}\] \[Time~Limit:1000MS~~Memory~Limit:65536K\] Description 如下图12 ...

  3. 2019-2020-5 20199317《Linux内核原理与分析》第五周作业

    第4章 系统调用的三层机制(上) 1  用户态.内核态和中断 大多数程序员在写程序时很难离开系统调用,与系统调用打交道的方式是通过库函数的方式,库函数用来把系统调用给封装起来. 计算机的硬件资源是有限 ...

  4. 走近深度学习,认识MoXing:初识华为云ModelArts的王牌利器 — MoXing

    [摘要] 本文为MoXing系列文章第一篇,主要介绍什么是MoXing,MoXing API的优势以及MoXing程序的基本结构. MoXing的概念 MoXing是华为云深度学习服务提供的网络模型开 ...

  5. 【开发者portal在线开发插件系列四】数组 及 可变长度数组

    基础篇 基础场景见上面两个帖子,这里单独说明数组和可变长度数组的用法. 话不多说,开始今天的演(表)示(演) Profile和插件开发 添加一个string类型的属性: 在插件里添加一条数据上报消息: ...

  6. es6 proxy浅析

    Proxy 使用proxy,你可以把老虎伪装成猫的外表,这有几个例子,希望能让你感受到proxy的威力. proxy 用来定义自定义的基本操作行为,比如查找.赋值.枚举性.函数调用等. proxy接受 ...

  7. 想实现多人协作的“在线Excel”?真没那么简单

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互 ...

  8. luogu P1650 田忌赛马 |贪心

    题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这里取得200银币. ...

  9. Spring Boot Validation,既有注解不满足,我是怎么暴力扩展validation注解的

    前言 昨天,我开发的代码,又收获了一个bug,说是界面上列表查询时,正常情况下,可以根据某个关键字keyword模糊查询,后台会去数据库 %keyword%查询(非互联网项目,没有使用es,只能这样了 ...

  10. HDU5394 Bomb

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 There are NN bombs needing exploding. Each bomb ha ...