Sida 1 av 1

Push- notification med IP-adress

Postat: 08 mar 2013, 11:15
av Trumstock
Hej!

Jag har en Ubuntu-server som agerar lagringsplats och torrentklient. Jag vill kunna komma åt servern via SSH oavsett var jag befinner mig, men jag har dynamisk IP. Jag har utan några direkt kunskaper försökt skriva ett litet script som ett par gånger om dagen körs och skickar min IP-adress som push-meddelande till min telefon. När jag provkör scriptet står det "-bash: ./ip-check.sh: bin/bash: felaktig tolk: Filen eller katalogen finns inte".

Vad är fel?

Kod: Markera allt

#!bin/bash

CURRENT=`curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<$
DIR=/home/john/current-ip
OLD=`cat $DIR`
API_KEY="KEY"
SUBJECT="Ny IP-adress"
MESSAGE=`cat $CURRENT`

if [ "$CURRENT" != "$OLD" ]; then
echo $CURRENT>$DIR
curl -d "apikey=$API_KEY&application=IP-not&event=$SUBJECT&description=$MESSAGE" "https://api.prowlapp.com/publicapi/add"


fi

Re: Push- notification med IP-adress

Postat: 08 mar 2013, 12:18
av andol
De första felet, det som klagar på, är att du saknar det inledande / du rimligen vill ha i sökvägen till bash. Ändra första raden till att istället se ut så här.

Kod: Markera allt

#!/bin/bash

Re: Push- notification med IP-adress

Postat: 08 mar 2013, 13:57
av BadOmen
Hej
du kanske kan komma åt din externa ip så här i stället:

Kod: Markera allt

curl ifconfig.me
Eller logga in på din server vi exempelvis http://www.noip.com/services/managed_dn ... c_dns.html.

Re: Push- notification med IP-adress

Postat: 09 mar 2013, 00:20
av Trumstock
Jag löste det till slut, tack för hjälpen! :)
Här är koden om någon är intresserad:

Kod: Markera allt

#!/bin/bash

CURRENT=`curl ifconfig.me`
DIR=/home/john/current-ip
OLD=`cat $DIR`
API_KEY="key"
SUBJECT="Ny IP-adress"
MESSAGE="$CURRENT"

if [ "$CURRENT" != "$OLD" ]; then
echo "$CURRENT">"$DIR"
curl -d "apikey=$API_KEY&application=IP-not&event=$SUBJECT&description=$MESSAGE" "https://api.prowlapp.com/publicapi/add"
fi

Re: Push- notification med IP-adress

Postat: 09 mar 2013, 14:13
av m!rage
Jag har skrivit ett Pythonskript för att göra ungefär samma sak, men som istället skickar e-post till mig när IP-adressen ändrats.

Kod: Markera allt

#!/usr/bin/env python3
"""
IP Monitor

version 1

Sends an e-mail if the network's external IP address has changed since last run.
"""

def get_ip():
    import urllib.request
    import re

    with urllib.request.urlopen('http://dns.loopia.se/checkip/checkip.php') as f:
        html = f.read().decode('utf-8')
        ip = re.findall('[0-9]+.[0-9]+.[0-9]+.[0-9]+', html)[0]
    
    return ip

def compare(ip):
    from os.path import expanduser
    home = expanduser("~")
    try:
        file = open(home + '/.ipmonitor', 'r')
        return file.read() == ip
    except IOError as e:
        return False

def update(ip):
    from os.path import expanduser
    home = expanduser("~")
    try:
        file = open(home + '/.ipmonitor', 'w')
        file.write(ip)
        return True
    except IOError as e:
        return False

def compose(ip, wrote, poster, recipient):
    from email.mime.text import MIMEText
    from email.utils import formatdate
    
    msg = MIMEText('')
    if wrote:
        msg.set_payload('New IP address: %s.' % ip)
    else:
        msg.set_payload('New IP address: %s.\n\nUnable to create config file!' % ip)
    msg['Subject'] = 'IP address change: %s' % ip
    msg['From'] = poster
    msg['To'] = recipient
    # RFC 2822: "Use local time". Anton: "Use UTC".
    msg['Date'] = formatdate(localtime = False)
    
    return msg

def send(msg, server, port):
    from netrc import netrc
    from smtplib import SMTP
    
    username, _, password = netrc().authenticators(server)
    
    smtp = SMTP(server, port)
    smtp.starttls()
    smtp.login(username, password)
    # smtp.send_message(msg) # Python 3.2
    smtp.sendmail(msg['From'], msg['To'], str(msg)) # Python 3.1
    smtp.quit()

def main():
    ip = get_ip()
    if compare(ip):
        pass
#        print('No change')
    else:
        print('New IP: %s' % ip)
        wrote = update(ip)
        if wrote:
            print('Wrote config')
        else:
            print('Failed to write config')
        msg = compose(ip, wrote, 'frånadress@example.com', 'tilladress@example.com')
        send(msg, 'smtp.example.com', 587)
        print('Sent e-mail')

if __name__ == '__main__':
    main()
Ändra frånadress@example.com, tilladress@example.com och smtp.example.com till lämpliga värden. Inloggningsuppgifter läses från ens .netrc-fil på ungefär det här formatet:

Kod: Markera allt

machine smtp.example.com
login frånadress@example.com
password lösenord
Jag låter cron köra skriptet på en server var sjätte timme med den här raden i min crontab:

Kod: Markera allt

0 */6 * * * ~/bin/ipmonitor.py