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 .+?\n.+? 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---
Linux中获取本机的最新IPv6地址_更新ddns的脚本的更多相关文章
- 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 ...
- Linux中获取本机网络信息的几个函数及应用
一.读取/etc/hosts 几个函数 头文件<netdb.h> 1.void sethostent(int stayopen);//开打/etc/hosts 配置文件 2.struct ...
- linux编程获取本机网络相关参数
getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程 ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...
- Linux 获取本机IP、MAC地址用法大全
getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...
- c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存
我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...
- Linux下获取本机IP地址的代码
Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...
- shell中获取本机ip地址
shell中获取本机ip地址 方法一: /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr ...
- 获取本机IP、mac地址、计算机名
python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid ...
- js获取本机的网络IP地址
JavaScript是一门脚本语言,是不能操作文件,读取本地信息的,所以想要获取IP,还需要借助后端技术.方法如下: //获取本机的网络ip地址 function jsonpCallback(res) ...
随机推荐
- 【Android - 组件】之Activity生命周期的全面分析
Activity是Android四大组件之首,其重要性不言而喻,Activity的生命周期更是我们了解Android工作机制的重中之重.我们一般将Activty的生命周期做两种情况下的理解,即正常情况 ...
- Djangoday1 入门及第一个apphelloworld
1 Django基础指令新建一个django project新建app创建数据库表,更新数据库表或字段使用开发服务器清空数据库创建超级管理员导出数据 导入数据Django 项目环境终端数据库命令行更多 ...
- js前端数据验证JS工具
var regexEnum = { intege : "^-?[1-9]\\d*$", // 整数 intege1 : "^[1-9]\\d*$", // 正整 ...
- Apple Developer swift教程学习笔记
https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6. ...
- react-native布局中的层级问题(zIndex,elevation)
目录 关于层级的zIndex/elevation 1.zIndex是rn在0.30开始支持的属性,是可以生效的: 2.shadow和elevation 结论 关于层级的zIndex/elevation ...
- go基础之服务退出问题
最近学习公司微服务的代码,看到每一个微服务的main函数都阻塞在那里,然后里面起的goroutine一直在哪里运行. package main import( "fmt" &quo ...
- JVM内运行时数据区
JVM的基本区域: 类加载子系统 运行时数据区(内存区域) 执行引擎 运行时数据区域 方法区(Method Area) 类的所有字和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来 ...
- R语言计算IV值
更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在对变量分箱后,需要计算变量的重要性,IV是评估变量区分度或重要性的统计量之一,R语言计算IV值的代码如下: Ca ...
- 笔记||Python3之面向对象
面向对象编程:简称OOP. 是一种程序设计思想.oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 在python中,所有数据类型都可以视为对象,也可以自定义对象.自定义的对象数据类 ...
- 基于cyusb3014的usb3.0双目摄像头开发测试小结(使用mt9m001c12stm)
测试图像 摄像头分辨率为1280*1024,双目分辨率为2560*1024 ps:时钟频率太高,时序约束还得进一步细化,图像偶尔会出现部分雪花,下一步完善