Python 监控外网 IP 是否变化,邮件发送最新 IP

Python 2016-03-29 01:06 2 条评论

最近入了一台 x5570 * 2 / 32GB / 1TB HDD 的服务器,想来想去装了一个 Ubuntu 闲置在家,主要目的还是打算做一个本地的裤子,docker 和 Python 练习机,捣腾一下稀奇古怪的东西。

但是每天在公司的时间比较多,回到家磨磨蹭蹭洗澡洗漱就占了不少时间。还有一些私事要处理,想想服务器不能这样闲置下去,不然白买了。遂把服务器的 ssh 服务打开,映射了个 IP。

但是因为是家用宽带,在公司连 ssh 速度方面绝对没有问题的了,而且白天带宽也不能白白浪费掉,不如在公司闲暇时间接上服务器做测试。那么问题来了,假如某个时间段网络断了重新拨号外网 IP 就变更了,这个时候握又不在家里,就要处理这一个问题了。

然后趁着今天晚上时间还算充足写了一个脚本监控外网 IP 是否有变化,如果有变化则给我发送一个邮件提醒我服务器的 IP 地址发生了变化。

虽然有 IPMI 但是觉得那玩意儿还是很蛋疼的。。

贴一下脚本,有需要的可以参考一下。时间定是定在每一个小时检查一次,如果觉得一个小时太久可以自行调节

#!/usr/bin/env python
#coding: utf-8
__author__ = 'abj3ct10n'

import requests
import re
import time
import smtplib
from email.mime.text import MIMEText

class GetIP():
    def __init__(self):
        self.ip = ""
        self.Get()

    def Get(self):
        header = {"User-Agent": "curl/7.43.0"}
        r = requests.get("http://ip.cn", headers=header).text

        while True:
            if self.ip == "":
                self.ip = re.findall(r'\d+.\d+.\d+.\d+', r)[0]
                self.SendMail(self.ip)
            else:
                self.NewIP = re.findall(r'\d+.\d+.\d+.\d+', r)[0]
                if self.ip != self.NewIP:
                    self.SendMail(self.NewIP)
                    self.ip == self.NewIP
            time.sleep(3600)

    def SendMail(self, ip):
        SendHost = "smtp.163.com" # STMP 地址
        SendUser = "username" # 帐号
        SendPass = "password" # 密码
        SendPostfix = "163.com"
        PickMail = ["to@xx.com"] # 接收邮箱

        SendMe = "Pick IP" + "<" + SendUser + "@" + SendPostfix + ">" # 设置发件昵称及邮箱
        SendMsg = MIMEText("your new IP address: %s" % ip, _subtype='html', _charset='gb2312') # 邮件内容
        SendMsg['Subject'] = "your new IP address" # 邮件主题
        SendMsg['From'] = SendMe
        SendMsg['To'] = ";".join(PickMail) # 接收邮箱

        try:
            Send = smtplib.SMTP()
            Send.connect(SendHost)
            Send.login(SendUser, SendPass)
            Send.sendmail(SendMe, PickMail, SendMsg.as_string()) # 发邮件
            Send.close()
        except Exception, e:
            print(str(e))

if __name__ == "__main__":
    GetIP()
2 条评论
  1. Y!an
    Y!an

    要是在你发完邮件后一秒 IP 变了,恰好你又急着连上去,2333
    在本地跑个定时任务呗,每五分钟去接收一次邮件,这样你就可以主动发邮件去获取 IP 了(这么做是为了不要每五分钟发一次邮件,很烦的

    2016-04-05回复
    1. abj3ct10n
      abj3ct10n

      这是等待指令嘛。反向的,不过一向懒惯了

      2016-04-06回复