how to modify /etc/hosts from shell scripts?
Solution 1
Take a look at augeas. It has a ready-made parser/serializer for the hosts file (that's even in their quick tour guide) and comes with a simple tool to make changes (augtool).
Solution 2
I'd rather not touch /etc/hosts
in terms of parsing and such. I'd simply create a directory called /etc/hosts.d/
and make up some script that takes:
- ip
- name
- aliases
creates one (1) file with one (1) line. The filename will be <ip>.host
and then cat /etc/hosts.d/*host > /tmp/hosts.new && mv /tmp/hosts.new /etc/hosts
. Maybe add an incron
event that watches the /etc/hosts.d/
directory and regenerates /etc/hosts
whenever something happens, that way you'll get rid of old entries too.
Related videos on Youtube
kagali-san
Updated on September 18, 2022Comments
-
kagali-san almost 2 years
I need to change some
hosts
entries - for example, there's a desire to updatehosts
to haveactive.vm
host match the IP of currently booted VM (with some testing appliance). Guest software within VM reports machine's address back to host, and I need to update /etc/hosts based on that information - there's always some time for writing another daemon/cronjob, but wanted to use something existing for fixinghosts
entries with a dumb syntax ofhostname current_ip
.Someone had recommended me the
bind-tools
package, but - itsnsupdate
|host
don't suit the task at all. ..Upd: still looking for something from bind suite, but at least dynamic regeneration seems to be the best solution, and augtool is nice too.
Upd: due to my laziness, dynamic regeneration is not planned to use right now, so started using augtool at the cronjob, that reads webserver's access logs for latest IP - at the VMs which run Windows, whole monitoring solution is just a webbrowser which loads specific url from host machine and has a small reload interval
-
kagali-san about 13 yearsit's a very nice idea, with complete regeneration, sir - at least it saves from having empty hosts file
-
kagali-san about 13 yearshm, it's in Gentoo portage tree, so will try it.. but somehow I feel that syntax of
augtool> set /files/etc/hosts/*[alias[1] = 'active.vm']/ipaddr 1.1.1.1
will not be tolerated by it. Will test.. -
kagali-san about 13 yearsit actually worked, but had to use
alias =
instead of addressingalias[1]
oralias[2]
.. it didn't supported them, so editing the entry by other than first name was impossible (not a problem, but will ask for a correct syntax on a list) -
BJladu4 over 12 yearsWhen you use
alias
in this expression, it matches anyalias
subnode, not just the firs the first one. -
chovy over 10 yearsthere's even a
brew
for it.