Sida 1 av 1

Skript för att kolla om gränsnitt är uppe?

Postat: 03 dec 2011, 22:50
av HOLMEN
Halloj,

Jag har en router som kör OpenWRT och ansluter till internet via ett 3G-modem (USB). Det är så att modemet ibland kopplar ner och jag behöver köra ifup för att få igång det igen.
Jag vill nu skapa ett skript som sätter upp gränssnittet igen automatiskt, eftersom det är bökigt att behöva köra det kommandot då och då, och när man inte ens är hemma och vill komma åt nätverket så är det också moment 22 över allting.

Jag tänker mig ett skript som antingen pingar en domän och baseras på om det får svar eller ej, eller igenom att köra ifconfig.

Nu är det så att jag inte kan så mycket om Bash och behöver hjälp för att då det att funka.

Detta är vad jag har skrivit hittils:

Kod: Markera allt

#!/bin/bash
check="ifconfig eth0 | grep 'Device not found'"
#echo $check

if [ "$check" ]
then 
	echo "Interface not connected"
	# Connect it ifup wan

else
	echo "Interface is up"
fi

exit 0
Jag förstår att det inte räcker med detta, men jag vet inte vad jag ska göra för att få det att funka.

Jag vet också att det finns en massa andra verktyg för liknande, men jag ville att det skulle vara simpelt och tänkte att det kunde vara kul att fixa det själv. Plus att det verkar vara mer för "riktiga" nätverskort och inte 3g-modem.

Tack på förhand

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 00:25
av ubot
Jag slängde ihop ett alternativ. Vad säger ni om det här?

Kod: Markera allt

#!/bin/bash
# Kör i en loop om och om igen.
while true; do
# Sätt variablen i till något som är högre än 249 (eftersom vi har index 0-249 i arrayn).
i=300
# Slumpa ett nytt värde så länge variabeln i är större eller lika med 250. Annars fortsätt exekvera skriptet.
while [[ "$i" -ge "250" ]]; do
i=$(echo "$RANDOM" | grep -o "[[:digit:]]$")
done
# En array med sajter att pinga slumpmässigt
site_array=( tumblr.com imdb.com nytimes.com bankofamerica.com bestbuy.com flickr.com zedo.com weather.com chase.com microsoft.com target.com about.com imgur.com livejasmin.com comcast.net wellsfargo.com optmd.com ask.com godaddy.com foxnews.com hulu.com secureserver.net yelp.com etsy.com cnet.com pinterest.com reddit.com pornhub.com xhamster.com ups.com newegg.com groupon.com ehow.com nfl.com adobe.com reference.com usps.com att.com aweber.com pandora.com googleusercontent.com outbrain.com constantcontact.com xvideos.com stumbleupon.com kohls.com washingtonpost.com toysrus.com warriorforum.com bbc.co.uk sears.com verizonwireless.com slickdeals.net macys.com rr.com wordpress.org vimeo.com wsj.com drudgereport.com allrecipes.com match.com salesforce.com photobucket.com thepiratebay.org pof.com cbssports.com fedex.com cj.com usatoday.com latimes.com youporn.com answers.com jcpenney.com swagbucks.com amazonaws.com americanexpress.com gap.com dailymail.co.uk shopathome.com indeed.com foxsports.com myspace.com tmz.com mywebsearch.com capitalone.com coupons.com cbsnews.com barnesandnoble.com pch.com homedepot.com avg.com comcast.com wikia.com overstock.com foodnetwork.com abcnews.go.com deviantart.com woot.com pogo.com addthis.com hootsuite.com typepad.com mashable.com bp.blogspot.com costco.com xnxx.com expedia.com people.com verizon.com tube8.com forbes.com statcounter.com retailmenot.com dell.com squidoo.com lowes.com zillow.com shoplocal.com ign.com clickbank.com staples.com reuters.com livingsocial.com redtube.com mapquest.com careerbuilder.com southwest.com thepostgame.com tripadvisor.com fiverr.com stackoverflow.com zappos.com monster.com usbank.com download.com hp.com cnbc.com yellowpages.com fbcdn.net tigerdirect.com meetup.com hostgator.com baidu.com mediafire.com whitepages.com techcrunch.com nih.gov digg.com doubleclick.com mozilla.org backpage.com webmd.com qvc.com nextag.com bloomberg.com businessinsider.com disney.go.com sparkstudios.com kmart.com wunderground.com youjizz.com manta.com cbslocal.com okcupid.com nordstrom.com surveymonkey.com instagr.am priceline.com wikimedia.org marketwatch.com sfgate.com linksynergy.com files.wordpress.com ca.gov hubpages.com earthlink.net buy.com conduit.com bfads.net intuit.com shareasale.com dailymotion.com ning.com realtor.com bleacherreport.com guardian.co.uk archive.org rivals.com nydailynews.com dropbox.com twitpic.com nypost.com trulia.com telegraph.co.uk sitesell.com citibank.com livejournal.com quickmeme.com vistaprint.com w3schools.com businessweek.com examiner.com cox.net istockphoto.com gamestop.com xhamstercams.com basecamphq.com mailchimp.com npr.org adultfriendfinder.com gotomeeting.com walgreens.com cbs.com sprint.com shutterfly.com boston.com bizrate.com bluehost.com accountonline.com samsclub.com ticketmaster.com skype.com victoriassecret.com weather.gov patch.com time.com delta.com filesonic.com gizmodo.com fatwallet.com alibaba.com accuweather.com kayak.com orbitz.com filestube.com engadget.com legacy.com spankwire.com t-mobile.com fandango.com ancestry.com abc.go.com chicagotribune.com cracked.com infusionsoft.com force.com nomorerack.com zazzle.com megaupload.com taleo.net )
# Pinga en slumpmässig sajt i arrayn och greppa efter "unknown host".
check1=$(ping ${site_array[$i]} | grep -o "unknown host")
if [[ "$i" -eq "0" ]]; then
check2=$(ping -c 10 ${site_array[$(( $i+1 ))]} | grep -o "unknown host")
else
check2=$(ping -c 10 ${site_array[$(( $i-1 ))]} | grep -o "unknown host")
fi
# Kontrollera att variablerna check1 och check2 inte är tomma (indirekt att dom innehåller strängen "unknown host") och kör ifconfig up om båda variablerna innehåller unknown host.
if [[ ! -z "$check1" && ! -z "$check2" ]]; then
   echo "Interface not connected"
   sudo ifconfig eth0 up
fi
# Pausa 60 s mellan varje körning av skriptet (så att google.com, facebook.com m.m. får vila)
sleep 60
done
ifconfig up måste köras med sudo vad jag vet. Och sudo fungerar inte utan vidare i ett skript. Så du får hitta på något där som gör att kommandot ifconfig körs utan att systemet klagar på användardrättigheter eller kräver lösenord.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 14:57
av HOLMEN
Tack så mycket!

Jag ska testa skriptet nu meddetsamma. Men är detta ett skript som inte behöver Cron då alltså? Hade helst använt mig av det.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 15:32
av HOLMEN
Hej igen,

Nu får jag lite dåligt samvete över att jag fick ett sådant ordentligt skript (som jag egentligen har annan användning för) och inte kommer att använda det i detta ändamål.

Jag tror att jag har löst det igenom detta skript:

Kod: Markera allt

#!/bin/sh
# 111204 - Daniel Holm <admin@danielholm.se>


# Ping set host too see if there is an internet connection or not. If not, do command
count=$(ping -c 4 google.se | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')

if [ "$count" != "4" ]; then
	# 100% failed
	echo "Nere - sätter upp"
	ifup wan
else
	echo "Redan uppe"
fi

exit 0
Det är inte perfekt, men det funkar och missar den en ping eller dyl så kommer den att re-connecta men det är okej tills vidare.

Men tack iallafall!

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 17:00
av Konservburk
HOLMEN skrev:

Kod: Markera allt

count=$(ping -c 4 google.se | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')

if [ "$count" != "4" ]; then
	# 100% failed
	echo "Nere - sätter upp"
	ifup wan
else
	echo "Redan uppe"
fi
Returvärdet för ping visar hur det gick. Testet borde inte behöva bli mer komplicerat än så här:

Kod: Markera allt

if ping -c4 google.se >&-
then
   echo lyckades
else
   echo misslyckades
fi

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 17:36
av ubot
Mitt skript går att använda i ett Cron job. Det som återstår att lösa är hur ifconfig ska köras utan sudo eller utan att skritet stoppar upp p.g.a. att sudo kräver lösenord.
Fördelen med mitt skript är att det alltid pingar två olika sajter (en sajt kan ju faktiskt ligga nere även om Internet-uppkopplingen fungerar) samt att jag inte pingar google.com om och om igen utan slumpar två sajter av världens 120 mest populära sajter. Om båda sajterna inte svarar så tolkar skriptet det som att internetuppkopplingen är nere och försöker starta upp den igen med ifconfig.

Hur ofta ska du pinga google.com? Jag inbillar mig att du riskerar att bli blockad om du pingar google.com 1 gång/minut 24/7. Eller har jag fel?

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 21:03
av axel112
ubot skrev:Mitt skript går att använda i ett Cron job. Det som återstår att lösa är hur ifconfig ska köras utan sudo eller utan att skritet stoppar upp p.g.a. att sudo kräver lösenord.

Kod: Markera allt

sudo nano /etc/crontab

/etc/init.d/cron restart

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 04 dec 2011, 23:00
av ubot
Eller ännu bättre:

Kod: Markera allt

sudo crontab -e
för ett cron job som root.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 05 dec 2011, 15:29
av HOLMEN
Jag använder mitt skript och har denna rad för cron ($ crontab -e)

0 */1 * * * /root/./check-if.sh

och check-if.sh innehåller alltså min kod ovan.

Jag hoppas att Google accepterar detta, men jag funderar på om jag ändå inste ska använda ditt skrip, ubot.

Edit: Missade en asterisk i cronraden.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 05 dec 2011, 16:40
av ubot
HOLMEN skrev:Jag använder mitt skript och har denna rad för cron ($ crontab -e)

0 /1 * * * /root/./check-if.sh

och check-if.sh innehåller alltså min kod ovan.

Jag hoppas att Google accepterar detta, men jag funderar på om jag ändå inste ska använda ditt skrip, ubot.
Du kan ju slänga in den här koden så "avlastar" du Google lite genom att variera sajt:

Kod: Markera allt

i=30
while [[ "$i" -ge "26" ]]; do
i=$(echo "$RANDOM" | grep -o "[[:digit:]]$")
done
site_array=( tumblr.com imdb.com nytimes.com bankofamerica.com bestbuy.com flickr.com zedo.com weather.com chase.com microsoft.com target.com about.com imgur.com livejasmin.com comcast.net wellsfargo.com optmd.com ask.com godaddy.com foxnews.com hulu.com secureserver.net yelp.com etsy.com cnet.com google.com )
och sedan ha den här koden för att pinga en sajt:

Kod: Markera allt

ping -c 5 ${site_array[$i]}
Den kombinationen för att du bara pingar en sajt (istället för två åt gången i mitt första skript) av totalt 26 (istället för 250 sajter i mitt första skript) åt gången men du pingar inte just google.com mer än i snitt 1/26 av gångerna.
0 /1 * * * /root/./check-if.sh
Måste du inte ha en rad som ser ut så här?

Kod: Markera allt

0 */1 * * * /root/./check-if.sh
eller fungerar det med bara /1? Hur som helst så tycker jag det låter mindre bra att bara pinga 1 gång/h. Är det inte bättre att pinga 1/26 sajter kanske var 5:e minut eller något? Så här:

Kod: Markera allt

*/5 * * * * /root/./check-if.sh
Det var lite detta som var min tanke. Det var därför jag hade med 250 sajter och anledningen till att jag pingade två sajter åt gången istället för en var för att gardera om en sajt skulle råka ligga nere p.g.a. strul hos sajten och inte med uppkopplingen.
Om du bara pingar google.com en gång/h så finns ju risken att du får vänta i nästan 1h på att internetuppkopplingen kommer tillbaka. Det tycker inte jag låter så kul. :|
Dessutom fungerar väl inte det här heller?
/root/./check-if.sh
Måste det inte vara typ:

Kod: Markera allt

'cd /root/ && ./check-if.sh'
eller har jag fel?

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 06 dec 2011, 02:19
av HOLMEN
Du har säkerligen rätt. Crontab-raden är nu fixad (var en miss mest asterisken, men kommandot funkar) och jag ska nog ta och redigera skriptet så att jag använder din array :)

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 06 dec 2011, 10:38
av ubot
Det är ett fel i min kod. Jag rekommenderar att du använder högst 10 sajter (index 0-9 i arrayn) för då fungerar koden. Så här ska det se ut:

Kod: Markera allt

i=10
while [[ "$i" -ge "10" ]]; do
i=$(echo "$RANDOM" | grep -o "[[:digit:]]$")
done
site_array=( flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com )
Då varierar du mellan 10 olika sajter i.a.f. Jag inbillar mig att det är bättre än att pinga en sajt hela tiden. Du kan ju pinga 10 ggr så ofta om inte annat om du slumpar 1/10 sajter varje gång skriptet körs.
Och du pingar med koden:

Kod: Markera allt

ping -c 5 ${site_array[$i]}
Du kan testa min kod genom att köra den här raden i kanalen:

Kod: Markera allt

while true; do i=10; while [[ "$i" -ge "10" ]]; do i=$(echo "$RANDOM" | grep -o "[[:digit:]]$"); done; site_array=( flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com ); echo "index: $i site: ${site_array[$i]}"; sleep 1; done
eller för att testa att pinga också:

Kod: Markera allt

while true; do i=10; while [[ "$i" -ge "10" ]]; do i=$(echo "$RANDOM" | grep -o "[[:digit:]]$"); done; site_array=( flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com ); echo "**** Array item: $i Pinging site: ${site_array[$i]} ****"; ping -c 3 ${site_array[$i]}; sleep 1; done

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 06 dec 2011, 23:29
av HOLMEN
Skulle du kunna sätt ihop detta till ett skript? Lite osäker på vad jag ska ersätta i mitt förra skript.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 07 dec 2011, 01:00
av ubot
HOLMEN skrev:Skulle du kunna sätt ihop detta till ett skript? Lite osäker på vad jag ska ersätta i mitt förra skript.
Det här är ditt skript med skillnaden att en rad slumpar fram ett tal mellan 0-9 och en annan rad skapar en array med sajter. Talet bestämmer vilken av sajterna som pingas strax efter i skriptet:

Kod: Markera allt

#!/bin/sh
# 111204 - Daniel Holm <admin@danielholm.se>

i=$(echo "$RANDOM" | grep -o "[[:digit:]]$")
site_array=( flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com )

# Ping set host too see if there is an internet connection or not. If not, do command
count=$(ping -c 4 ${site_array[$i]} | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')

if [ "$count" != "4" ]; then
   # 100% failed
   echo "Nere - sätter upp"
   ifup wan
else
   echo "Redan uppe"
fi

exit 0

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 08 dec 2011, 03:28
av HOLMEN
Jag får följande fel på rad 5:
./check-if.sh: line 5: syntax error: unexpected "("

Fattar inte varför? Gillar inte /bin/sh arrays?

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 08 dec 2011, 08:37
av Konservburk
HOLMEN skrev:Jag får följande fel på rad 5:
./check-if.sh: line 5: syntax error: unexpected "("

Fattar inte varför? Gillar inte /bin/sh arrays?
Det är en bash-grej, i alla fall på det sätt som ubot har gjort. Och det gäller även $RANDOM.

Om vi utgår från att du vill göra samma sak som den här bash-koden:

Kod: Markera allt

i=$(echo "$RANDOM" | grep -o "[[:digit:]]$")
site_array=( flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com )
echo ${site_array[$i]}
Fast du vill använda /bin/sh, då kan du göra något i stil med detta istället:

Kod: Markera allt

set flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com
site=$(eval echo \$$(expr $(od -An -dN2 /dev/urandom) % $# + 1))
echo $site

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 08 dec 2011, 18:14
av ubot
Eller så byter du:

Kod: Markera allt

#!/bin/sh
till

Kod: Markera allt

#!/bin/bash
om det inte spelar någon roll om det är ett bash-skript eller ej.

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 08 dec 2011, 20:48
av HOLMEN
Har tydligen inte bash på routern, så det får bli /bin/sh för detta.

Ska testas.
Tack! :)

Re: Skript för att kolla om gränsnitt är uppe?

Postat: 14 feb 2012, 01:01
av HOLMEN
Tack för hjälpen, ubot.

Nu ser det ut på detta sättet:

Kod: Markera allt

#!/bin/sh
# 120213 - Daniel Holm <admin@danielholm.se>
# v2.0

# Set some hosts to ping
set flickr.com weather.com microsoft.com ask.com google.com facebook.com yahoo.com hulu.com comcast.com youtube.com google.se twitter.com

# Randomize it
site_array=$(eval echo \$$(expr $(od -An -dN2 /dev/urandom) % $# + 1))

# Debug
echo $site_array

# Ping a random host and see if answers
count=$(ping -c 4 $site_array | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')

# Count the answers and if it doenst get a answer for every ping, take that as internet is down and put it up again
if [ "$count" != "4" ]; then
   # 100% failed
   echo "Down - put it up"
   ifup wan
else
   echo "Already up"
fi

exit 0