linux 脚本 ipv6登录,Linux中获取本机的最新IPv6地址_更新ddns的脚本

运营商提供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---

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值