CentOS定时将路由器的外网IP发送到指定电子邮箱中

出于节约成本的考虑,家用和小型商用宽带通常使用 ADSL 虚拟拨号。ADSL 宽带在下载速度约 4M 时与普通光纤的体感差别不大,但一个明显问题是没有固定公网 IP,每次重新拨号都可能获得新的动态 IP。这样一来,远程维护服务器或网络设备就会变得不方便。

如果局域网内有一台 Linux 主机,可以让它定时获取当前路由器的公网 IP,并通过邮件发送到指定邮箱。

一、获得当前路由器的外网 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 时,表示每分钟都要执行 programf2 时,表示每小时都要执行,其余类推。
  • f1a-b 时,表示从第 a 分钟到第 b 分钟这段时间内执行;f2a-b 时,表示从第 a 小时到第 b 小时执行,其余类推。
  • f1/n 时,表示每隔 n 分钟执行一次;f2/n 时,表示每隔 n 小时执行一次,其余类推。
  • f1a,b,c 时,表示在第 abc 分钟执行;f2a,b,c 时,表示在第 abc 小时执行,其余类推。

原文地址:http://changmingzhi.blog.163.com/blog/static/29678048201428114710683/

Leave a Reply