-
-
Save irazasyed/a7b0a079e7727a4315b9 to your computer and use it in GitHub Desktop.
#!/bin/sh | |
# PATH TO YOUR HOSTS FILE | |
ETC_HOSTS=/etc/hosts | |
# DEFAULT IP FOR HOSTNAME | |
IP="127.0.0.1" | |
# Hostname to add/remove. | |
HOSTNAME=$1 | |
function removehost() { | |
if [ -n "$(grep $HOSTNAME /etc/hosts)" ] | |
then | |
echo "$HOSTNAME Found in your $ETC_HOSTS, Removing now..."; | |
sudo sed -i".bak" "/$HOSTNAME/d" $ETC_HOSTS | |
else | |
echo "$HOSTNAME was not found in your $ETC_HOSTS"; | |
fi | |
} | |
function addhost() { | |
HOSTNAME=$1 | |
HOSTS_LINE="$IP\t$HOSTNAME" | |
if [ -n "$(grep $HOSTNAME /etc/hosts)" ] | |
then | |
echo "$HOSTNAME already exists : $(grep $HOSTNAME $ETC_HOSTS)" | |
else | |
echo "Adding $HOSTNAME to your $ETC_HOSTS"; | |
sudo -- sh -c -e "echo '$HOSTS_LINE' >> /etc/hosts"; | |
if [ -n "$(grep $HOSTNAME /etc/hosts)" ] | |
then | |
echo "$HOSTNAME was added succesfully \n $(grep $HOSTNAME /etc/hosts)"; | |
else | |
echo "Failed to Add $HOSTNAME, Try again!"; | |
fi | |
fi | |
} |
I don't think the HOSTS_LINE
is correct. 127.0.0.1
is generally given the hostname localhost
, so simply adding 127.0.0.1\t$HOSTNAME
will result in two lines with the same IP address, which I believe is not a valid configuration. On my machine, the hostname is given the address 127.0.1.1
instead. A better approach might be to simply search-and-replace for the hostname rather than deleting the line, so that the same IP address is re-used.
for ubuntu 16.04. this changes worked for me
change sh to bash
changing arg 1 to 2 (arg1 is the function)
droping hostname from addhost
#!/bin/bash
# copy from https://gist.github.com/irazasyed/a7b0a079e7727a4315b9
# PATH TO YOUR HOSTS FILE
ETC_HOSTS=/etc/hosts
# DEFAULT IP FOR HOSTNAME
IP="127.0.0.1"
# Hostname to add/remove.
HOSTNAME=$2
removehost() {
echo "removing host";
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME Found in your $ETC_HOSTS, Removing now...";
sudo sed -i".bak" "/$HOSTNAME/d" $ETC_HOSTS
else
echo "$HOSTNAME was not found in your $ETC_HOSTS";
fi
}
addhost() {
echo "adding host";
HOSTS_LINE="$IP\t$HOSTNAME"
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME already exists : $(grep $HOSTNAME $ETC_HOSTS)"
else
echo "Adding $HOSTNAME to your $ETC_HOSTS";
sudo -- sh -c -e "echo '$HOSTS_LINE' >> /etc/hosts";
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME was added succesfully \n $(grep $HOSTNAME /etc/hosts)";
else
echo "Failed to Add $HOSTNAME, Try again!";
fi
fi
}
$@
I was always getting 127.0.0.1 as the host number that was added, so I changed IP to $3 and it started working for me.
#!/bin/bash
# copy from https://gist.github.com/irazasyed/a7b0a079e7727a4315b9
# PATH TO YOUR HOSTS FILE
ETC_HOSTS=/etc/hosts
# DEFAULT IP FOR HOSTNAME
IP=$3
# Hostname to add/remove.
HOSTNAME=$2
removehost() {
echo "removing host";
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME Found in your $ETC_HOSTS, Removing now...";
sudo sed -i".bak" "/$HOSTNAME/d" $ETC_HOSTS
else
echo "$HOSTNAME was not found in your $ETC_HOSTS";
fi
}
addhost() {
echo "adding host";
HOSTS_LINE="$IP\t$HOSTNAME"
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME already exists : $(grep $HOSTNAME $ETC_HOSTS)"
else
echo "Adding $HOSTNAME to your $ETC_HOSTS";
sudo -- sh -c -e "echo '$HOSTS_LINE' >> /etc/hosts";
if [ -n "$(grep $HOSTNAME /etc/hosts)" ]
then
echo "$HOSTNAME was added succesfully \n $(grep $HOSTNAME /etc/hosts)";
else
echo "Failed to Add $HOSTNAME, Try again!";
fi
fi
}
$@
I would use tee -a
to append to the hosts file instead of sudo sh
.
printf "%s\t%s\n" "$IP" "$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
This way only tee
needs to run with root privileges, instead of spawning a new shell as root. Using printf
you can format the whole line and use \t
without having to rely on echo -e
.
Updated this a bit. It will now not remove subdomains. I also made other improvements.
#!/usr/bin/env bash
# Path to your hosts file
hostsFile="/etc/hosts"
# Default IP address for host
ip="127.0.0.1"
# Hostname to add/remove.
hostname="$2"
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
remove() {
if [ -n "$(grep -p "[[:space:]]$hostname" /etc/hosts)" ]; then
echo "$hostname found in $hostsFile. Removing now...";
try sudo sed -ie "/[[:space:]]$hostname/d" "$hostsFile";
else
yell "$hostname was not found in $hostsFile";
fi
}
add() {
if [ -n "$(grep -p "[[:space:]]$hostname" /etc/hosts)" ]; then
yell "$hostname, already exists: $(grep $hostname $hostsFile)";
else
echo "Adding $hostname to $hostsFile...";
try printf "%s\t%s\n" "$ip" "$hostname" | sudo tee -a "$hostsFile" > /dev/null;
if [ -n "$(grep $hostname /etc/hosts)" ]; then
echo "$hostname was added succesfully:";
echo "$(grep $hostname /etc/hosts)";
else
die "Failed to add $hostname";
fi
fi
}
$@
I like it, but grep -p
is not available. Use grep -P
instead 😄
#!/usr/bin/env bash
# Path to your hosts file
hostsFile="/etc/hosts"
# Default IP address for host
ip="127.0.0.1"
# Hostname to add/remove.
hostname="$2"
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
remove() {
if [ -n "$(grep -P "[[:space:]]$hostname" /etc/hosts)" ]; then
echo "$hostname found in $hostsFile. Removing now...";
try sudo sed -ie "/[[:space:]]$hostname/d" "$hostsFile";
else
yell "$hostname was not found in $hostsFile";
fi
}
add() {
if [ -n "$(grep -P "[[:space:]]$hostname" /etc/hosts)" ]; then
yell "$hostname, already exists: $(grep $hostname $hostsFile)";
else
echo "Adding $hostname to $hostsFile...";
try printf "%s\t%s\n" "$ip" "$hostname" | sudo tee -a "$hostsFile" > /dev/null;
if [ -n "$(grep $hostname /etc/hosts)" ]; then
echo "$hostname was added succesfully:";
echo "$(grep $hostname /etc/hosts)";
else
die "Failed to add $hostname";
fi
fi
}
$@
hello haiii..
can you please send me for " Printing only Ip address and hostname " by using shellscript.
hello haiii..
Any one can please send me for " Printing only Ip address and hostname " by using shellscript.
to this mail.: [email protected]
Re-factored this a bit and turned them into simple functions you can just paste into your .bash_aliases and most importantly you can use whatever IP you want say the one from your vagrant box for instance see bash_aliases.sh
Hi, could someone explain me how to use this script on a Mac please ?
I like it, but
grep -p
is not available. Usegrep -P
instead#!/usr/bin/env bash # Path to your hosts file hostsFile="/etc/hosts" # Default IP address for host ip="127.0.0.1" # Hostname to add/remove. hostname="$2" yell() { echo "$0: $*" >&2; } die() { yell "$*"; exit 111; } try() { "$@" || die "cannot $*"; } remove() { if [ -n "$(grep -P "[[:space:]]$hostname" /etc/hosts)" ]; then echo "$hostname found in $hostsFile. Removing now..."; try sudo sed -ie "/[[:space:]]$hostname/d" "$hostsFile"; else yell "$hostname was not found in $hostsFile"; fi } add() { if [ -n "$(grep -P "[[:space:]]$hostname" /etc/hosts)" ]; then yell "$hostname, already exists: $(grep $hostname $hostsFile)"; else echo "Adding $hostname to $hostsFile..."; try printf "%s\t%s\n" "$ip" "$hostname" | sudo tee -a "$hostsFile" > /dev/null; if [ -n "$(grep $hostname /etc/hosts)" ]; then echo "$hostname was added succesfully:"; echo "$(grep $hostname /etc/hosts)"; else die "Failed to add $hostname"; fi fi } $@
On running the above script as follows (i.e second argument is empty), the contents od the entire /etc/hosts file gets removed
sh manage-etc-hosts.sh remove
Attaching the script with a small fix
#!/usr/bin/env bash
# Path to your hosts file
hostsFile="/etc/hosts"
# Default IP address for host
ip="0.0.0.0"
# Hostname to add/remove.
hostname="$2"
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
if [ -z "$1" ] || [ -z "$2" ]; then
die "Exiting... invalid arguments";
fi
remove() {
if [ -n "$(grep -w "$hostname$" /etc/hosts)" ]; then
echo "$hostname found in $hostsFile. Removing now...";
try sudo sed -ie "/[[:space:]]$hostname/d" "$hostsFile";
else
yell "$hostname was not found in $hostsFile";
fi
}
add() {
if [ -n "$(grep -P "[[:space:]]$hostname" /etc/hosts)" ]; then
yell "$hostname, already exists: $(grep $hostname $hostsFile)";
else
echo "Adding $hostname to $hostsFile...";
try printf "%s\t%s\n" "$ip" "$hostname" | sudo tee -a "$hostsFile" > /dev/null;
if [ -n "$(grep $hostname /etc/hosts)" ]; then
echo "$hostname was added succesfully:";
echo "$(grep $hostname /etc/hosts)";
else
die "Failed to add $hostname";
fi
fi
}
$@
References
I use this to resolve my problem.
#!/bin/sh
# run:
# ./manage-etc-hosts.sh add 10.20.1.2 test.com
# ./manage-etc-hosts.sh remove 10.20.1.2 test.com
# PATH TO YOUR HOSTS FILE
ETC_HOSTS=/etc/hosts
function remove() {
# IP to add/remove.
IP=$1
# Hostname to add/remove.
HOSTNAME=$2
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
echo "$HOSTS_LINE Found in your $ETC_HOSTS, Removing now...";
sudo sed -i".bak" "/$HOSTS_LINE/d" $ETC_HOSTS
else
echo "$HOSTS_LINE was not found in your $ETC_HOSTS";
fi
}
function add() {
IP=$1
HOSTNAME=$2
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
line_content=$( printf "%s\t%s\n" "$IP" "$HOSTNAME" )
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
echo "$line_content already exists : $(grep $HOSTNAME $ETC_HOSTS)"
else
echo "Adding $line_content to your $ETC_HOSTS";
sudo -- sh -c -e "echo '$line_content' >> /etc/hosts";
if [ -n "$(grep -P $HOSTNAME $ETC_HOSTS)" ]
then
echo "$line_content was added succesfully";
else
echo "Failed to Add $line_content, Try again!";
fi
fi
}
$@
changing the console from sh to bash worked for me like a charm in ubuntu 20.04
#!/bin/bash
# run:
# ./manage-etc-hosts.sh add 10.20.1.2 test.com
# ./manage-etc-hosts.sh remove 10.20.1.2 test.com
# PATH TO YOUR HOSTS FILE
ETC_HOSTS=/etc/hosts
function remove() {
# IP to add/remove.
IP=$1
# Hostname to add/remove.
HOSTNAME=$2
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
echo "$HOSTS_LINE Found in your $ETC_HOSTS, Removing now...";
sudo sed -i".bak" "/$HOSTS_LINE/d" $ETC_HOSTS
else
echo "$HOSTS_LINE was not found in your $ETC_HOSTS";
fi
}
function add() {
IP=$1
HOSTNAME=$2
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
line_content=$( printf "%s\t%s\n" "$IP" "$HOSTNAME" )
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
echo "$line_content already exists : $(grep $HOSTNAME $ETC_HOSTS)"
else
echo "Adding $
```line_content to your $ETC_HOSTS";
sudo -- sh -c -e "echo '$line_content' >> /etc/hosts";
if [ -n "$(grep -P $HOSTNAME $ETC_HOSTS)" ]
then
echo "$line_content was added succesfully";
else
echo "Failed to Add $line_content, Try again!";
fi
fi
}
$@
how do we solve the problem of password prompt. Every time i run the script it ask for password. I dont want to enter the password manually. Has any one solved this problem???
how do we solve the problem of password prompt. Every time i run the script it ask for password. I dont want to enter the password manually. Has any one solved this problem???
Do you mean password prompt when you use sudo command?
https://phpraxis.wordpress.com/2016/09/27/enable-sudo-without-password-in-ubuntudebian/
changing the console from sh to bash worked for me like a charm in ubuntu 20.04
#!/bin/bash # run: # ./manage-etc-hosts.sh add 10.20.1.2 test.com # ./manage-etc-hosts.sh remove 10.20.1.2 test.com # PATH TO YOUR HOSTS FILE ETC_HOSTS=/etc/hosts function remove() { # IP to add/remove. IP=$1 # Hostname to add/remove. HOSTNAME=$2 HOSTS_LINE="$IP[[:space:]]$HOSTNAME" if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ] then echo "$HOSTS_LINE Found in your $ETC_HOSTS, Removing now..."; sudo sed -i".bak" "/$HOSTS_LINE/d" $ETC_HOSTS else echo "$HOSTS_LINE was not found in your $ETC_HOSTS"; fi } function add() { IP=$1 HOSTNAME=$2 HOSTS_LINE="$IP[[:space:]]$HOSTNAME" line_content=$( printf "%s\t%s\n" "$IP" "$HOSTNAME" ) if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ] then echo "$line_content already exists : $(grep $HOSTNAME $ETC_HOSTS)" else echo "Adding $ ```line_content to your $ETC_HOSTS"; sudo -- sh -c -e "echo '$line_content' >> /etc/hosts"; if [ -n "$(grep -P $HOSTNAME $ETC_HOSTS)" ] then echo "$line_content was added succesfully"; else echo "Failed to Add $line_content, Try again!"; fi fi } $@
I think you made a typo here
echo "Adding $ ```line_content to your $ETC_HOSTS";
should be this I guess:
echo "Adding $line_content to your $ETC_HOSTS";
how do we solve the problem of password prompt. Every time i run the script it ask for password. I dont want to enter the password manually. Has any one solved this problem???
chmod 666 /etc/hosts
Thanks for the scripts. I tried them but these scripts are adding new lines even though the same IP already exists. This does not conform with the /etc/hosts format and can cause issues.
Therefore I created a script that adds the hostname to the IP address line if the IP already exists in the hosts file. Only if it doesn't exist, a new line will be added. Gist is here: https://gist.github.com/ceelian/0c293cf0e10c924a2124e2c9fa3805a9
Thanks for the scripts. I tried them but these scripts are adding new lines even though the same IP already exists. This does not conform with the /etc/hosts format and can cause issues.
Therefore I created a script that adds the hostname to the IP address line if the IP already exists in the hosts file. Only if it doesn't exist, a new line will be added. Gist is here: https://gist.github.com/ceelian/0c293cf0e10c924a2124e2c9fa3805a9
this script does't remove, we need that. thanks!
For example I can't use experimental podman on an old host, so I have to build and use httperf directly and try to add host aliases without being too cumbersome:
add_host_alias "host:ip" && httperf ... && remove_host_alias "host:ip"
Productionized for my use of httperf. Tested a bit.
#!/bin/bash
# Synopsis:
# ./alterhost.sh add-host test.com:1.2.3.4
# ./alterhost.sh add-host 'test.com:1.2.3.4;test2.com:2.3.4.5;test3.com:3.4.5.6'
# ./alterhost.sh del-host test.com:1.2.3.4
# ALTER_VERBOSE=t ./alterhost.sh del-host test.com:1.2.3.4
if test $# -lt 2 ; then
echo "USAGE: alterhost <verb> '<name:ip;name:ip;name:ip...>' "
echo 'EX: ./alterhost.sh add-host test.com:1.2.3.4'
echo "EX: ./alterhost.sh add-host 'test.com:1.2.3.4;test2.com:2.3.4.5;test3.com:3.4.5.6'"
echo 'EX: ./alterhost.sh del-host test.com:1.2.3.4'
echo 'EX: ALTER_VERBOSE=t ./alterhost.sh del-host test.com:1.2.3.4'
echo "EX: ./alterhost.sh add-host 'www.test.org:2.3.5.6' ; httperf --server www.test.org --uri /LICENSE.txt --num-conns 10 --rate 10 --timeout 10 --hog --ssl ; ./alterhost.sh del-host 'www.test.org:2.3.5.6'"
exit -1
fi
# PATH TO YOUR HOSTS FILE
#ETC_HOSTS=/etc/hosts
ETC_HOSTS=./test_etc_hosts
[ ! -f $ETC_HOSTS.bak2 ] && cp -p $ETC_HOSTS $ETC_HOSTS.bak2
function msg() {
MESSAGE=$1
if [[ -z "${ALTER_VERBOSE}" ]]; then
exit 0
else
echo $MESSAGE
fi
}
function del-host() {
for i in $(echo $1 | sed -e 's/;/\n/g'); do
readarray -t HOSTIP < <(echo $i | awk -F':' '{print $1; print $2}')
IP=${HOSTIP[1]}
HOSTNAME=${HOSTIP[0]}
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
msg "${HOSTIP[*]} Found in your $ETC_HOSTS, Removing now..."
sudo sed -i".bak" "/$HOSTS_LINE/d" $ETC_HOSTS
else
msg "${HOSTIP[*]} was not found in your $ETC_HOSTS"
fi
done
}
function add-host() {
for i in $(echo $1 | sed -e 's/;/\n/g'); do
readarray -t HOSTIP < <(echo $i | awk -F':' '{print $1; print $2}')
IP=${HOSTIP[1]}
HOSTNAME=${HOSTIP[0]}
HOSTS_LINE="$IP[[:space:]]$HOSTNAME"
line_content=$( printf "%s\t%s\n" "$IP" "$HOSTNAME" )
if [ -n "$(grep -P $HOSTS_LINE $ETC_HOSTS)" ]
then
msg "$line_content already exists : $(grep $HOSTNAME $ETC_HOSTS)"
else
msg "Adding $line_content to your $ETC_HOSTS";
sudo -- sh -c -e "echo '$line_content' >> $ETC_HOSTS";
if [ -n "$(grep -P $HOSTNAME $ETC_HOSTS)" ]
then
msg "$line_content was added succesfully";
else
msg "Failed to Add $line_content, better take a look!";
exit -1
fi
fi
done
}
$@
@kucerarichard in your script I needed to change the msg function from 'exit 0' to 'return' so that it wouldn't exit unless run with verbose flag.
function msg() {
MESSAGE=$1
if [[ -z "${ALTER_VERBOSE}" ]]; then
exit 0
else
echo $MESSAGE
fi
}
To:
function msg() {
MESSAGE=$1
if [[ -z "${ALTER_VERBOSE}" ]]; then
return
else
echo $MESSAGE
fi
}
What would be the downside/danger of looking at grep
's exit code instead of comparing strings?
if grep -q $HOSTNAME /etc/hosts; then
# Entry already exists
else
# Add in the entry
fi
In line 30 I added:
And in the last line I added:
"$@"
to run it doing: