内网获取公网IP通过钉钉通知

很多时候内网做了公网映射,出门在外想要连回家,可以通过获取的公网IP访问回去,当然了,也可以把映射的IP指定到域名下,直接访问域名就可与访问家里局域网,但是呢,还是用获取公网IP连回去简单粗暴。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/sh

DATE="`date +%Y%m%d`"
DATE1="`date +%Y-%m-%d`"
DATE2="`date +%H:%M:%S`"

webhook='https://oapi.dingtalk.com/robot/send?access_token=tian'自己钉钉机器人的key'

OLD_IP=$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' checkip.txt)
NEW_IP=$(curl -s myip.ipip.net | sed s/IP://g | awk '{print $2}')

province=$(curl -s myip.ipip.net | awk '{print $4}')
city=$(curl -s myip.ipip.net | awk '{print $5}')

ISP=$(curl -s myip.ipip.net | awk '{print $6}')

function CheckIp
{
real_ip=$(echo $ip|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $OLD_IP|grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null
then
if [ ${real_ip:no}=="yes" ]
then
echo "ip合法"
else
echo "ip不合法"
return 1
fi
else
echo "ip格式错误"
return 2
fi
}

function Validation {
if [ $NEW_IP = $OLD_IP ];
then
echo "IP一致,不必更新"
else
echo "IP不一致,执行更新"
echo $NEW_IP > checkip.txt #这个txt需要和脚本处在同级目录下
Update
fi
}

function Update {
curl $webhook -H 'Content-Type: application/json' -d '
{
"msgtype": "markdown",
"markdown": {
"title":"IP已更新,请注意查收!", #钉钉机器人添加IP关键字
"text": "# IP:'${NEW_IP}'\n\n---\n> 时间:'${DATE1}' '${DATE2}'\n\n> 归属地:'${province}''${city}'\n\n> 运营商:'${ISP}'"
},
"at": {
"atMobiles": [
"自己的手机号码"
],
"isAtAll": false
}
}'

}

CheckIp $OLD_IP
Validation

注意checkip.txt的路径,然后把脚本添加到系统定时任务里。

成品效果图