So it is nice to be able to remotely connect to your home computer. Many (included my) ISPs, give dynamic IP addresses, and although these don’t change often, they do change and are a pain to remember anyway. My solution is to have my computer e-mail me whenever it discovers it has a new IP address! You can easily configure exim4 to send emails from a linux machine through gmail, a great guide is here.
Once you have that you just need a little script, mine does this with python by asking http://icanhazip.com. and writing a temporary file with the old ip in /var/tmp. It only sends you a message when the IP changes, no need to spam your email box!
#!/usr/bin/python
''' A super simple script to email changes in a dynamic IP to
an email address. If you drop this in /etc/cron.* , it will periodically
poll a website to check if your iP has changed, and if it has it well
send you an e-mail with the new one!
Alex Knaust - 2/28/2013
'''
import os, smtplib, urllib2, re
from email.mime.text import MIMEText
# file to save the last IP address in
IPLOC = '/var/tmp/ip'
# site from which to get IP, if you change this you might need to alter get_live_ip
IPSITE = 'http://icanhazip.com'
# Message to send yourself with the IP
MAILSTR = '''Hi, My new IP address is {0}\n'''
# Address from which the email is being sent (this should probably match your SMTP setup
FROMADDR = 'you@host.com'
# Address to which to send the message
TOADDR = 'you@host.com'
#####################################################
############### CODE ################################
#####################################################
def save_ip(ipstr):
'''Save the Ip to IPLOC, return true if successful, false otherwise'''
try:
with open(IPLOC, 'w') as f:
f.write(ipstr)
except:
return False
return True
def get_old_ip():
'''Gets the old IP by reading IPLOC, returns None if it could not be read'''
try:
with open(IPLOC, 'r') as f:
ip = f.read()
return ip.strip()
except IOError:
return None
def get_live_ip():
'''Return the IP address of this computer by polling IPSITE
returns None if not successful
'''
try:
f = urllib2.urlopen(IPSITE)
return f.read().strip()
except urllib2.URLError:
return None
def send_mail(ipstr):
'''Tries to send an email about the change of IP to the TOADDR
returns true if successful, false otherwise
'''
msg = MIMEText(MAILSTR.format(ipstr))
msg['Subject'] = 'IP Address change'
msg['From'] = FROMADDR
msg['To'] = TOADDR
try:
s = smtplib.SMTP('localhost')
s.sendmail(FROMADDR, [TOADDR, ], msg.as_string())
s.quit()
except:
return False
return True
def main():
oldip = get_old_ip()
newip = get_live_ip()
if newip is not None:
if oldip is not None:
if newip != oldip:
send_mail(newip)
save_ip(newip)
else:
send_mail(newip)
save_ip(newip)
if __name__ == '__main__':
main()