原文转载自:https://bbs.hassbian.com/thread-25596-1-1.html
(出处: 『瀚思彼岸』» 智能家居技术论坛)
家里的nas挂在了op上,op上装了lucky666,使用阿里云DDNS做了动态域名解析,常规情况下只能获取到op自身的公网地址,不能解析到op下面设备的公网地址,但是大吉支持使用脚本获取ip,这就有得玩了。
最开始,采用了如下命令当脚本(第一版)
获取指定MAC设备的IPV6:ip -6 neigh | grep -v FAILED |grep -v ^fe80 |grep "your_mac" | grep -v "::" |awk '{print $1}'
1.ip -6 neigh,获取局域网内所有ipv6地址
2.grep -v FAILE,删除失败的行
3.grep -v ^fe80,删除局域网ipv6地址行
4.grep "your_mac" ,提取包含指定MAC的行,your_mac替换成你需要获取公网IP的设备mac地址,这个一般设备外壳铭牌上有,也可以直接在路由器里面找到,不会的自行搜吧。
5.grep -v "::",删除含“::”的行,即删除短的那个公网IPV6地址。
6.awk '{print $1}',提取行内ipv6地址(在前面命令获取字符串中间有空格的前提下,以空格为分隔符,指被分割开的第一串字符)。
采用这个命令,确实获取到了nasIPV6的公网地址,但是,用了一段时间,有一天突然解析不了。回家登录大吉后台查看,指令获取的一直是一个空字符串。
ssh登录op,测试了下,ip -6 neigh获取到的nas公网IPV6地址只有短地址,没有长的那个了,但是只有使用长的才能访问到nas;再仔细研究了下,短地址“::”字符前面的字符串就是ipv6公网给的前缀,同时还获取到了nas在局域网的本地ipv6地址,fe80:后面的字符串刚好是nas公网ipv6长地址的后缀,因此有了第二版。
(第二版)最开始是直接写了个sh脚本放在etc文件夹内,但是只能在ssh界面获取到ip,在大吉内调用脚本显示错误;后来直接把脚本内容粘贴在大吉域名解析的脚本框里面,成了。
#!/bin/bash
#截取nasIPV6地址长IP;赋值符号前后不能有空格
str0=$(ip -6 neigh | grep -v FAILED |grep -v ^fe80 |grep “your_mac” | grep -v “::” |awk ‘{print $1}’)
#方法二,分别获取前缀后后缀
#截取公网ipv6地址前半段
str1=$(ip -6 neigh | grep -v FAILED |grep -v ^fe80 |grep “your_mac” |awk ‘{print $1}’ | cut -d ‘:’ -f1-4)
#截取本地ipv6地址后半段
str2=$(ip -6 neigh | grep -v FAILED |grep ^fe80 |grep “your_mac” |awk ‘{print $1}’ | cut -d ‘:’ -f2-6)
#判断方法一是否能获取,若方法一结果为空,采用方法二拼合,否则采用方法一
if test -z "${str0}"
then
str=${str1}${str2}
else
str=$str0
fi
echo $str #回显最终结果
大吉真实配置范例:
#!/bin/bash
str0=""
str1=$(ip -6 neigh | grep -v FAILED |grep -v ^fe80 |grep "bc:24:11:ae:21:e0" |awk '{print $1}' | cut -d ':' -f1-4)
str2=$(ip -6 neigh | grep -v FAILED |grep ^fe80 |grep "bc:24:11:ae:21:e0" |awk '{print $1}' | cut -d ':' -f2-6)
if test -z "${str0}"
then
str=${str1}${str2}
else
str=$str0
fi
echo $str