出于节约成本的考虑,家用和小型商用宽带通常使用 ADSL 虚拟拨号。ADSL 宽带在下载速度约 4M 时与普通光纤的体感差别不大,但一个明显问题是没有固定公网 IP,每次重新拨号都可能获得新的动态 IP。这样一来,远程维护服务器或网络设备就会变得不方便。
如果局域网内有一台 Linux 主机,可以让它定时获取当前路由器的公网 IP,并通过邮件发送到指定邮箱。
Table of Contents
一、获得当前路由器的外网 IP
可以使用 curl 查询当前出口 IP:
curl ifconfig.me
执行后会返回当前路由器对外访问互联网时使用的公网 IP。接下来,把这个 IP 地址通过 Email 发送到指定邮箱。
用 vim GetIP.sh 编写一个脚本:
#!/bin/bash
# Program:
# Send Router IP of Internet to certain email
# History:
# 2014-03-08 cmzsteven First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin/:~/bin
export PATH
curl ifconfig.me | mail -s "Router IP of Internet" changmingzhi@163.com
保存退出:
:wq
然后给脚本增加执行权限:
chmod +x /root/GetIP.sh
如果系统没有 mail 命令,需要先安装并配置邮件发送工具。CentOS 上通常可以检查或安装 mailx:
which mail
rpm -q mailx
邮件能否正常发出,还取决于本机 MTA 或外部 SMTP 配置,建议先手动运行脚本确认能够收到邮件。
二、定时执行
把这个脚本加入计划任务 crontab 中。如果你是管理员,可以编辑系统级计划任务:
vim /etc/crontab
系统级 /etc/crontab 需要包含执行用户,例如:
1 */1 * * * root /root/GetIP.sh
上面的配置表示每小时的第 1 分钟执行一次。
如果使用当前用户的计划任务:
crontab -e
则不需要写 root 这一列,例如:
1 */1 * * * /root/GetIP.sh
如果希望每天 1:01 执行一次,在 /etc/crontab 中可以写成:
1 1 * * * root /root/GetIP.sh
在用户自己的 crontab -e 中则写成:
1 1 * * * /root/GetIP.sh
需要注意,使用 /n 时要确认前面的字段是否仍为 。例如:
* */2 * * * root /root/GetIP.sh
这条规则表示“每隔 2 小时内的每一分钟都执行一次”,因此在对应小时里会每分钟发送一封邮件。若只想每 2 小时执行一次,应写成:
1 */2 * * * root /root/GetIP.sh
剩下的工作是在路由器中设置虚拟服务器、端口转发或 NAT 转换,这里不再展开介绍。
三、时程表的格式
crontab 的基本格式如下:
f1 f2 f3 f4 f5 program
其中:
f1表示分钟。f2表示小时。f3表示一个月中的第几日。f4表示月份。f5表示一个星期中的第几天。program表示要执行的程序或命令。
常见写法如下:
- 当
f1为时,表示每分钟都要执行program;f2为时,表示每小时都要执行,其余类推。 - 当
f1为a-b时,表示从第a分钟到第b分钟这段时间内执行;f2为a-b时,表示从第a小时到第b小时执行,其余类推。 - 当
f1为/n时,表示每隔n分钟执行一次;f2为/n时,表示每隔n小时执行一次,其余类推。 - 当
f1为a,b,c时,表示在第a、b、c分钟执行;f2为a,b,c时,表示在第a、b、c小时执行,其余类推。
原文地址:http://changmingzhi.blog.163.com/blog/static/29678048201428114710683/
