试验环境: Ubuntu 20.04.3 LTS
背景
有时候一台远程主机启用的是DHCP,IP地址可能会在重启以后变化。如果是在同一个局域网,还可以通过局域网mac扫描工具扫描出mac地址对应的IP地址,在远程则做不到。这时候如果有个自启动任务将本机IP地址发送出来就解决这个问题了。
获取本机IP地址的办法:
ip r
输出类似如下:
default via x.x.x.y dev INAME proto dhcp src x.x.x.z metric 100
x.x.x.k/n dev INAME proto kernel scope link src x.x.x.z
x.x.x.y dev INAME proto dhcp scope link src x.x.x.z metric 100
结合grep和awk解析IP地址:
ipaddress=`ip r | grep default | awk '{print $9}'`
发送IP地址
常用的一种做法是通过电子邮件发送IP地址,不过要配置smtp服务器等比较麻烦;你也可以往MQ上发一个消息,不过得配置消息服务器和使用消息客户端。我这里用一个更简单的办法,就是发送一个http请求,前提是你手头上正好有一个web服务器。首先在web服务器跟目录创建一个 ping-ip.txt文件,随便写个什么内容进去,例如"pong"。将上一步解析到的ipaddress作为url参数请求:
curl "http://your-webserver.com/ping-ip.txt?ip=$ipaddress"
这样再去web服务器查看访问日志就可以看到IP地址了:
cat /var/log/apache2/access.log | grep ping-ip
开机启动任务
可以按照systemd服务规范自己写一个service,或者使用传统的rc.local方式。
Ubuntu 20.04并没有默认启动rc-local.service, 参考这篇文章启动传统兼容的rc.local。编辑/etc/rc.local文件内容如下:
#!/bin/bash
ipaddress=`ip r | grep default | awk '{print $9}'`
echo "IP is $ipaddress"
curl "http://your-webserver.com/ping-ip.txt?ip=$ipaddress"
exit 0
延展
这种方式再扩展一下,你可以传送更多参数;web服务器端接收程序如果改成动态脚本,还可以将IP地址记录到数据库或者其他持久存储中。