问题
I use Ubuntu server as NAT router. WAN interface is eth1 and LAN interface is eth0. I use ucarp virtual ip on LAN side for failover. I am writing a script which will bring down LAN interface eth0 if WAN link or default gateway goes down (If LAN interface goes down, then ucarp can release the NAT gateway ip to another router on the network). Also if the WAN ip gets pinged then LAN interface should come up and should remain up until WAN ip can be pinged.
Bash Script:
#!/bin/bash
t1=$(ifconfig | grep -o eth0)
t2="eth0"
#RMT_IP = "8.8.8.8"
SLEEP_TIME="10"
ping -c 2 8.8.8.8 > /dev/null
PING_1=$?
if [ $PING_1 = 1 ]; then
if [ "$t1" != "$t2" ]; then
ifconfig eth0 up
echo "Iface brought up"
else
echo "Iface is already up"
fi
else
if [ "$t1" = "$t2" ]; then
ifconfig eth0 down
echo "Iface brought down"
else
echo "iface already down"
fi
fi
sleep $SLEEP_TIME
The script does not work for me. What I want is, if a WAN ip can be pinged then the LAN interface eth0 should remain up. If the WAN ip cannot be pinged, then the interface should be brought down. The script should run on loop every 10 seconds. If the WAN ip cannot be pinged for extended period of time then eth0 should remain down only and if the WAN ip gets pinged after some time then eth0 should be brought up. I also plan to run the script on boot up as an upstart job.
EDIT 1: My final script:
#!/bin/bash
timeout=5 # delay between checks
pingip='8.8.8.8' # what to ping
iface="eth0"
LOG_FILE="/var/log/syslog"
isdown=0 # indicate whether the interface is up or down
# start assuming interface is up
while true; do
LOG_TIME=`date +%b' '%d' '%T`
if ping -q -c 2 "$pingip" >> /dev/null ; then # ping is good - bring iface up
if [ "$isdown" -ne 0 ] ; then
ifup $iface && isdown=0
printf "$LOG_TIME $0: Interface brought up: %s\n" "$iface" | tee -a $LOG_FILE
fi
else # ping is bad - bring iface down
beep -f 4000
if [ "$isdown" -ne 1 ] ; then
ifdown $iface && isdown=1
printf "$LOG_TIME $0: Interface brought down: %s\n" "$iface" | tee -a $LOG_FILE
fi
fi
sleep "$timeout"
done
回答1:
try this one
if ping succeeds then bring $iface up
if ping fails then bring $iface down
#!/bin/bash
timeout=3 # delay between checks
iface="eth0" # which interface to bring up/down
pingip='8.8.8.8' # what to ping
isdown=-1 # indicate whether the interface is up(0) or down(1)
# start in unknown state
while true; do
if ping -q -c 2 "$pingip"; then # if ping is succeeds bring iface up
if [ "$isdown" -ne 0 ]; then # if not already up
ifconfig "$iface" up && isdown=0
printf ":: iface brought up: %s\n" "$iface"
fi
elif [ "$isdown" -ne 1 ]; then # if ping failed, bring iface down, if not already down
ifconfig "$iface" down && isdown=1
printf ":: iface brought down: %s\n" "$iface"
fi
sleep "$timeout"
done
来源:https://stackoverflow.com/questions/10243845/bash-script-to-bring-up-and-down-an-interface-on-loop