The Answer Guy
Dynamic IP Address Publishing Hack
From Ronald Kuetemeier on Sat, 05 Dec 1998
Here is an expect script that you might find useful for your article.
It keeps a connection to the internet up and running with a
dynamically assigned ip address.
It updates html file(s) with the assigned ip address and ftps it to a
well known server on the internet.
Ronald
> =====================================================================
#!/usr/bin/expect -f
#expect script to keep a www server connected to the internet over
#dynamically assigned ip address
#Ronald Kuetemeier 11/1/1998 dket@mail.saber.net
#Replace all xxxx with your values
#initial ppp server address to see if we are already up
#change this to your ftp server ip addr.
set server xxx.xxx.xxx.xxx
#use of ppp script to make sure ppp is down and can be restarted
#change this to your local ppp up/down script
proc logon {} {
system xxxx stop
close
wait
sleep 10
system xxxx start
close
wait
sleep 35
ping 1
}
#get ip's from ifconfig
proc getip {} {
spawn ifconfig
expect -re "P-t-P:\[0-9\]+.\[0-9\]+.\[0-9\]+.\[0-9]+"
close
wait
setip $expect_out(buffer)
}
}
#find local ip and remote server ip address from ifconfig
proc setip {out} {
global server
set ips [string range $out [string first "Point-to-Point" $out]
[string length $out]]
regexp P-t-P:\[0-9\]+.\[0-9\]+.\[0-9\]+.\[0-9]+ $ips server_1
regexp addr:\[0-9\]+.\[0-9\]+.\[0-9\]+.\[0-9]+ $ips client_1
regexp \[0-9\]+.\[0-9\]+.\[0-9\]+.\[0-9\]+ $server_1 server
regexp \[0-9\]+.\[0-9\]+.\[0-9\]+.\[0-9\]+ $client_1 client
changeaddr $client
}
#ping to see if connection is still up
proc ping {i} {
global server
while {1} {
if {$i == 6} {
logon
getip
set $i 0
}
spawn ping -c 1 -n $server
expect {
"bytes from" break
"100% packet loss" close
ret=-1 close
}
wait
incr i
puts $i
sleep 3
}
close
wait
}
#change to your local userid and passwd and file transfer
proc ftp {} {
#change to your ftp server
spawn ftp xxx.xxx.xxx
expect "Name*:"
send "xxxx\r"
expect "Password:"
send "xxxx\r"
expect "ftp>"
#change to your ftp server directory,i.e public_html
send "cd xxxxx\r"
expect {
#change file to transfer [file]
"2*ftp>" [send "put xxxx.xxxx\r"]
"550*ftp>" ftp_error
}
expect {
#change or delete file 2 transfer [file 2]
"2*ftp>" [send "put xxxx.xxxx\r"]
"No such file" ftp_error
}
close
wait
}
proc ftp_error {} {
puts "FTP ERROR\n"
close
wait
}
# use sed to replace unique name with ip addr in a file
proc changeaddr {client} {
#change file names and local dns name
# [DNS] [in.file] [out file]
system sed 's/xxxx.xxxxxxx.xxx/$client/' xxx.xxxx > xxxx.xxxx
close
wait
#change file names and local dns name or delete this
# [DNS] [in.file] [out file]
system sed 's/xxxx.xxxxxx.xxxx/$client/' xxxx.xxxx > xxxx.xxxx
close
wait
ftp
}
ping 6
while {1} {
puts "Main loop\n"
ping 1
sleep 9
}
I'll just leave this as is. However, I'd suggest that the 'pppup' script documented in the 'pppd' man pages would provide some of the IP addresses that you are laboriously extracting from spawn command outputs using regexes.
Also It would make a lot of sense to write up an article around this script and publish that in LG yourself.
![]() |
a | b | c | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | |||||
| 15 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |||||||
| 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 44 | ||||||
| 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 64 | 65 | 66 |
| 67 | 69 | 72 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 84 | 85 | 86 | 87 | 91 | 94 | 95 | 96 | 97 | 98 |