# BASH - Get external IP and upload it to a FTP server

## bazik

I have a dynamic IP at home and want to be able to access my Linux box via SSH from work without using a dyndns provider. 

This little script gets the the current external IP (from dyndns.org, how ironic  :Smile:  ), writes it into a HTML file and uploads it to a FTP server. For additional security, I protected the directory on my webserver with a .htaccess file (luck that my provider supports this  :Smile:  ).

Hope this helps anyone, improvment ideas are appreciated! 

```

#!/bin/bash

##################################################################

#                                                                #

# upip.sh - Get external IP and upload it to a ftp server.       #

# Written by Sven Blumenstein <me@0x1337.net>                    #

#                                                                #

##################################################################

#                                                                #

# for security reasons, this file does not contain the username  #

# and password of the ftp server. for authentication, create a   #

# file called ".netrc" in the home directory of the user running #

# this script and write the following in it:                     #

#                                                                #

# machine yourdomain.com login youruser password yourpass        #

#                                                                #

# dont forget to "chmod 0400 .netrc"!                            #

# if you do a "ftp yourdomain.com" now, ftp gets the login data  #

# from ".netrc".  see "man netrc" for more info.                 #

#                                                                #

##################################################################

DOMAIN=yourdomain.com

DIR=myip

IP_PATH=/tmp/index.html

IP_FILE=`basename $IP_PATH`

MACHINE=`hostname`

# TIME=`date +%H:%M:%S`

if [ `uptime | awk -F, '{print NF}'` = 5 ]; then

  TIME=`uptime | awk -F, '{print $1}'`

else

  TIME=`uptime | awk -F, '{print $1, $2}'`

fi

IP=`wget -q -O - http://checkip.dyndns.org | grep Address | awk '{print $4}'`

 if [ -e $IP_PATH ]; then

    rm -f $IP_PATH

 else

    touch $IP_PATH

 fi

cat << EOF > $IP_PATH

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 <html>

 <head>

 <title>External IP Address of $MACHINE</title>

 </head>

 <body><center><p><br><br>

 IP: $IP<br>$TIME

 </p></center></body>

 </html>

EOF

 (echo cd $DIR; echo del $IP_FILE; echo put $IP_PATH $IP_FILE; echo bye) | ftp $DOMAIN 1>&2>/dev/null

```

----------

## Binestar

Pretty good script, but I don't like that it rely's on dyndns to report your IP Address to the script.

You can just use /sbin/ifconfig

```

#!/bin/bash

##################################################################

#                                                                #

# publiship.sh - Get external IP and upload it to a ftp server.  #

# Written by Sven Blumenstein <me@0x1337.net>                    #

# Modified by Christopher Fisk <chrisf@NOSPAM-mhonline.net       #

#                                                                #

##################################################################

#                                                                #

# dont forget to "chmod 0700 publiship.sh"!                      #

#                                                                #

# USE: Add this script to your crontab at an interval that       #

#  suits you.  15 minutes should be fine.                        #

#                                                                #

# Make sure that the FTPDIR exists.  This script will error out  #

#  if it does not.                                               #

#                                                                #

# If you want to setup a second crontab entry to upload the      #

#  IP address to the FTP server even if the IP Address hasn't    #

#  changed you can use the command 'publicip.sh override'        #

#                                                                #

# For example:                                                   #

#  */15 * * * * /path/to/publiship.sh                            #

#  3 */3 * * * /path/to/publiship.sh override                    #

#                                                                #

# The first crontab entry runs publiship.sh normally, exiting    #

#  if the IP Address has not changed.                            #

# The second crontab entry runs publiship.sh with the override   #

#  flag set.  That causes the IP Address to be uploaded again    #

#  thus setting a new timestamp on the file.  This can also      #

#  you to know if your computer has possibly crashed/lost it's   #

#  internet connection.                                          #

#                                                                #

##################################################################

OVERRIDE=$1

DOMAIN=yourdomain.tld

FTPUSER=ftpusername

FTPPASS=ftppassword

FTPDIR='/path/to/webfolder/for/upload/'

IP_PATH=/tmp/index.html

OLDIPFILE=/tmp/oldip

MACHINE=`/bin/hostname`

IP=`/sbin/ifconfig eth0 | grep inet | awk '{print $2}'| awk -F : '{print $2}'`

if [ "$OVERRIDE" == "override" ]; then

  IPCHANGED=1

else

  if [ -e "$OLDIPFILE" ]; then

    OLDIP=`cat $OLDIPFILE`

    if [ "$OLDIP" = "$IP" ]; then

      IPCHANGED=0

    else

      IPCHANGED=1 

    fi

  else

    IPCHANGED=1

  fi 

fi

if [ "$IPCHANGED" = "1" ]; then

  if [ `uptime | awk -F, '{print NF}'` = 5 ]; then

    TIME=`uptime | awk -F, '{print $1}'`

  else

    TIME=`uptime | awk -F, '{print $1, $2}'`

  fi 

echo $IP > $OLDIPFILE

cat << EOF > $IP_PATH

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>External IP Address of $MACHINE</title>

</head>

<body><center><p><br><br>

$MACHINE<br>IP: $IP<br>$TIME

</p></center></body>

</html>

EOF

ncftpput -u $FTPUSER -p $FTPPASS -a $DOMAIN $FTPDIR $IP_PATH

else

 echo 'IP Still the same'

fi

```

Make sure that code is mode 0700 and only the owner of the script will be able to read it.  It's just as secure as having a .netrc file.

What my script does is cuts down on the amount of times that it sends the updated information to the ftp server, which the admin of the server will like.

BTW:  I like the idea enough to edit it for my use, thanks =)

BinestarLast edited by Binestar on Tue Dec 10, 2002 9:41 pm; edited 1 time in total

----------

## bazik

 *Binestar wrote:*   

> Pretty good script, but I don't like that it rely's on dyndns to report your IP Address to the script.
> 
> You can just use /sbin/ifconfig
> 
> 

 

Thanks for your reply and the modified code!

The reason I dont use ifconfig is, that the machine I want to access is not directly connected to the Internet. The connection goes this way:

Linux box -> Switch -> Win2K box with 2 NIC -> DSL Modem

The Win2K box is running a Firewall and Proxy. I activated IP forwarding to get direct connection from the Linux box to the Internet (using the Win2K box as gateway). On the Win2K box I forward one port to port 22 on the Linux box for SSH access  :Smile: 

P.S.: Looking over your code, here is one hint: 

If you want to run something in crontab in regular intervalls (for example 15 minutes), you can use a slash to indicate the intervall instead of writing each cycle:

```

*/15 * * * * /blah/blub/bleh.sh

```

is the same as

```

0,15,30,45 * * * * /blah/blub/bleh.sh

```

I also noticed that my DSL modem times out too fast and therefore the time window to connect is a bit small. So I added this line to keep the connection open for 3 minutes:

```

ping -c 18 -i 10 $DOMAIN 1>&2>/dev/null

```

(make 18 pings and wait 10 seconds after each)

P.P.S.:

Just if someone wonders why I dont use a DynDns provider: Having a static DNS (to a dynamic IP) makes you more attackable to have a dynamic IP which changes on every reconnect  :Smile:  (just my opinion and aslong as I dont run a private webserver, I dont need a static DNS / IP )

regards,

bazik

----------

## Twink

I have a similar script but I text it to my cell phone using a icq perl script I found, I was gonna make it so that everytime my ip changes it sends it to me, but I realised I have static, so no  point.

----------

## charlieg

Using a Win2k box as a router/firewall for your linux boxen.  Almost poetic in it's irony.

----------

## Raccroc

Very nice...One piece of advice though.

Setup your keys and use scp instead of ftp.  Much more secure and no passwords over the wire.

----------

## bazik

 *charlieg wrote:*   

> Using a Win2k box as a router/firewall for your linux boxen.  Almost poetic in it's irony.

 

Its not fully under my control so I cant change this  :Sad: 

----------

## bazik

 *Raccroc wrote:*   

> Very nice...One piece of advice though.
> 
> Setup your keys and use scp instead of ftp.  Much more secure and no passwords over the wire.

 

Nope, I dont have SSH access to my ISPs webserver   :Very Happy: 

----------

## Slack006

Ok, I'm trying to modify this code for my personal use, and from what I can tell it's ready to go. I keep getting "line 73: syntax error: unexpected end of file"  :Sad:  I've gone over the code a million times, but I am no expert. Any of you jedis see the obvious mistake I am making?

```
#!/bin/bash

############################################

# This script is used to retreive the      #

# external IP Address from a Linksys       #

# BEFSR41 Firewall Router.                 #

#                                          #

#     Last Modified: 01/25/03              #

############################################

### VARIABLES ###

OVERRIDE=$1

REM_HOST=ftp.mydomain.com

REM_DIR=/

OLD_IP_FILE=/storage/last_ip

IP_PATH=/

IP_FILE=index.html

MACHINE=home.mydomain.com

LOC_IP_FILE=/tmp/index.html

# Get's the Status page from the router, and places it in the /tmp directory.

wget -q -P/tmp --http-user= --http-passwd=firewallpassword 192.168.6.1/Status.htm

# Retreives the IP address from the mess that is the status page

IP=$(less /tmp/Status.htm | grep "IP Address" | awk '{print $236}' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')

# Removes Status.htm from the /tmp directory

rm -f /tmp/Status.htm

# Checks to see if the 'override' command was given.

# If it is not in override mode, then checks to see if IP

# has changed...

if [ "$OVERRIDE" == "override" ]; then

  IPCHANGED=1

else

  if [ -e "$OLD_IP_FILE" ]; then

    OLDIP=`cat $OLD_IP_FILE`

    if [ "$OLDIP" = "$IP" ]; then

      IPCHANGED=0

    else

      IPCHANGED=1

    fi

  else

    IPCHANGED=1

  fi

fi

# Stores current IP for next use.

echo $IP > $OLD_IP_FILE

# Builds HTML page for display.

if [ "$IPCHANGED" = "1" ]; then

  cat << EOF > $LOC_IP_FILE

!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>External IP Address of $MACHINE</title>

</head>

<body><center><p><br><br>

$MACHINE<br>IP: $IP<br>

</p></center></body>

</html>

EOF

# Uploads file to remote server.

  (echo cd $REM_DIR; echo del $IP_FILE; echo put $IP_PATH $IP_FILE; echo bye) | ftp $REM_HOST 1>&2>/dev/null

  rm -f $LOC_IP_FILE

else

  echo 'IP Still the same'

fi
```

----------

