I have a server at home that I access with internal IP 192.168.etc.etc. I have a dynamic domain thanks to dyndns in the form of ewasx.dyndns.tv. So when I want to contact my server from outside my home network I use ewasx.dyndns.tv and when I want to access it from home I have to use the internal IP. That’s a bit of a pain, isn’t it? My home router is not clever enough to understand that when I contact ewasx.dyndns.tv from within my network I want it to be sent to my home server. My router just freaks out and does nothing. I have 3 computers at home. A linux, a mac and a windows. The linux and mac ones always stay home so I don’t need to bother. The windows though is my work computer and is always travelling, so I needed a script to check whether I am at home and modify the hosts file to map ewasx.dyndns.tv to the internal IP address of the server when I am at home, and to reverse it once I’m out.
Here is what I did, I’m sure there are more clever ways but my windows scripting skills are equal to zero, I have googled it quite a bit but haven’t found a solution, so I decided to learn the basics of windows batch scripting and give it a try.
working folder is: C:batch
I have created one file called hostsupdate.bat. In it there is:
IPCONFIG |FIND /C "192.168.X.X">%TEMP%temp.txt if errorlevel 1 C:batchswitch_remote.bat if errorlevel 0 C:batchswitch_local.bat
Where 192.168.X.X is the internal IP of my windows computer when I am at home (I have configured my wireless router to always assign the same IP to the mac address of my windows box).
I wonder if I need to add an EXIT at the end of this .bat file.
Then file switch_remote.bat
if exist C:WINDOWSsystem32driversetcremote exit del C:WINDOWSsystem32driversetchosts copy C:WINDOWSsystem32driversetchosts.remote C:WINDOWSsystem32driversetchosts echo 1> C:WINDOWSsystem32driversetcremote del C:WINDOWSsystem32driversetclocal
and finally file switch_local.bat.
if exist C:WINDOWSsystem32driversetclocal exit del C:WINDOWSsystem32driversetchosts copy C:WINDOWSsystem32driversetchosts.local C:WINDOWSsystem32driversetchosts echo 1> C:WINDOWSsystem32driversetclocal del C:WINDOWSsystem32driversetcremote
Same here, do I need EXIT? Oh well, so far it looks OK.
you need to create the two template hosts files you need for when you are remote (C:WINDOWSsystem32driversetchosts.remote) and when you are home (C:WINDOWSsystem32driversetchosts.local).
Writing that I see that I should have placed those templates in my batch folder so that I can easily back it up and re-use it on another computer one day. I can’t be bothered.
Once all of that is done you can execute hostsupdate.bat. It will check whether you have a home style IP, and if yes it will check if there is a ‘lock file’ saying that your hosts file is already in ‘local mode’, if that’s the case it’ll exit, if not it will switch the config to ‘remote mode’.
Now, I run that every 10 min via the tasks scheduler, to keep it in silent mode I use Hidden Start. It took me quite a few attempts before getting it right in the tasks scheduler, so here is how it is in the “Run:” section:
C:batchhstart.exe /NOCONSOLE “hostsupdate.bat”