[BASH] Aan waarde in bestand een variabele toekennen

Pagina: 1
Acties:

  • LollieStick
  • Registratie: Juni 2001
  • Laatst online: 15-12-2025
Geachte "collega's",

Voor mijn werk ben ik bezig met een script. Voor dit script heb ik een document met pingresultaten. Deze resultaten bevatten alleen het ip-adres van de doelhost en het resultaat (wel antwoord of geen antwoord). Nu moet ik aan elk ip-adres dat in deze lijst voorkomt (en elke komt niet vaker voor als één keer), een variabele toekennen. Dus als in de lijst ip-adressen 192.168.1.1 t/m 100 voorkomen zou ik honderd verschillende variabelen krijgen (zoiets als $IP1 t/m $IP100).

Hoe kan ik dit het beste realiseren. Ik heb al wat op google zitten rondneuzen, maar wordt niet veel wijzer. Hoofdzakelijk omdat ik het ook lastig vind te definiëren wat ik nu eigenlijk precies zoek in zo min mogelijk woorden. Kan iemand mij helpen hiermee?

Thanks :)

[ Voor 10% gewijzigd door LollieStick op 09-09-2009 12:36 ]


Verwijderd

In welke taal ga je dit script schrijven ?
Wat is precies het doel van het script ?

In eerste instantie dacht ik aan arrays voor dergelijke situaties.

  • LollieStick
  • Registratie: Juni 2001
  • Laatst online: 15-12-2025
Het is een script om de uptime van een aantal servers te checken. Wanneer een server down is moet er een mail gestuurd worden en een waarschuwing in een logfile gepropt worden. Het is een "simpele" bash-script.

Echter voor iemand met geen of nauwelijks ervaring met bash-scripting of scripting in het algemeen een hele klus.

[ Voor 10% gewijzigd door LollieStick op 09-09-2009 12:41 ]


  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 21:10
Bestaat er in Bash niet zoiets als een array dan? Volgens mij wel:

http://tldp.org/LDP/abs/html/arrays.html

Dat is dan toch een veel gemakkelijkere manier om het te realiseren?

Verwijderd

Ik denk dat google je vriend is bij het zoeken op uptime scripts voor deze omgevingen.
Bijvoorbeeld : http://bash.cyberciti.biz...formation-in-html-format/

Wil je zelf aan de slag in een script, meer info over arrays: http://tldp.org/LDP/abs/html/arrays.html

  • LollieStick
  • Registratie: Juni 2001
  • Laatst online: 15-12-2025
Het is inderdaad de bedoeling het zelf te doen. Ook om te leren hoe het één en ander in elkaar steekt. De beste manier om het te leren is toch door het zelf uit te proberen.
Ik zit nu het voorbeeld en het verhaaltje van de arrays door te lezen en doe mijn best het een beetje te snappen :P

We hebben verder ook geen statistieken nodig van de servers (zitten ook Windows bakken bij). Alleen ben je er wel of ben je er niet... Ben je er wel, dan is er niets aan de hand. Ben je er niet, dan willen we graag een mailtje.

Ik lees (en leer) verder...
Bedankt voor zo ver :)

[ Voor 6% gewijzigd door LollieStick op 09-09-2009 12:51 ]


Verwijderd

Hier zijn wat handige linkjes als je gaat bash scripten:

Advanced Bash Scripting Guide
Common Shell Script Mistakes
How to Debug Bash Scripts

Zorg ook dat je een editor met syntax coloring hebt; dat scheelt echt een hoop ergernis. :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
BASH vragen horen in NOS ( Waar hoort mijn topic? )

PRG -> NOS

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Grap van een variabele is..... dat die variabel is. Je kent geen variabele toe aan een waarde, het is andersom. De vraag is mij dan ook erg onduidelijk. Je hebt al een lijst met ip's en resultaten, wat wil je daar nu precies mee ?
Of heb je alleen een lijst met ip-nummers, en wil je mbv het script het resultaat van de pingtest opslaan ?

Beetje onduidelijk wat mij betreft.


Edit: Hoe dan ook, volgens mij is een array overbodig.
Je wilt een loopje, waarbij elke keer een regel uit de lijst gelezen wordt, ping uitgevoerd wordt, afhankelijk van het resultaat een actie gedaan wordt, resultaat in de log weggeschreven wordt, en dan verder met de volgende regel uit je lijst.

[ Voor 28% gewijzigd door u_nix_we_all op 09-09-2009 14:51 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • cherwin
  • Registratie: Maart 2006
  • Niet online
code:
1
2
3
4
for host in $hosts
do
    if ! ping -c 1 $host; then mail $email <<< "$host appears to be down"; fi
done
Zoiets ongeveer, nu nog een aantal sanity-checks en juiste variabelen erbij toevoegen en je bent klaar. :)

Tell me your problem, not the solution you think I should build for you.


Verwijderd

LollieStick schreef op woensdag 09 september 2009 @ 12:39:
Het is een script om de uptime van een aantal servers te checken. Wanneer een server down is moet er een mail gestuurd worden en een waarschuwing in een logfile gepropt worden. Het is een "simpele" bash-script.
Dat is geen monitoren. Ik zou je aanraden om je werkgever zo snel mogelijk eens naar systemen zoals Nagios, Zabbix te kijken.

  • cherwin
  • Registratie: Maart 2006
  • Niet online
Verwijderd schreef op woensdag 09 september 2009 @ 14:56:
[...]


Dat is geen monitoren. Ik zou je aanraden om je werkgever zo snel mogelijk eens naar systemen zoals Nagios, Zabbix te kijken.
+1

Er zijn hier inderdaad veel betere pakketten voor dan zelf iets in elkaar toveren.

Tell me your problem, not the solution you think I should build for you.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op woensdag 09 september 2009 @ 14:56:
[...]


Dat is geen monitoren. Ik zou je aanraden om je werkgever zo snel mogelijk eens naar systemen zoals Nagios, Zabbix te kijken.
Dit is ook een dienst die je af kunt nemen als 't om publiek bereikbare servers gaat. Bijvoorbeeld Pingdom heeft over de hele wereld servers staan die precies dit uitspoken. Ik laat op die manier mijn websites checken elke minuut.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • LollieStick
  • Registratie: Juni 2001
  • Laatst online: 15-12-2025
u_nix_we_all schreef op woensdag 09 september 2009 @ 14:40:
Grap van een variabele is..... dat die variabel is. Je kent geen variabele toe aan een waarde, het is andersom. De vraag is mij dan ook erg onduidelijk. Je hebt al een lijst met ip's en resultaten, wat wil je daar nu precies mee ?
Of heb je alleen een lijst met ip-nummers, en wil je mbv het script het resultaat van de pingtest opslaan ?

Beetje onduidelijk wat mij betreft.
Ik heb dus zoiets:

code:
1
2
IP="192.168.1.1 192.168.1.2"     # ik kan hier eventueel nog 100 ip-adressen toevoegen.
ping  -c1 $IP | grep -A1 statistics >> /tmp/file.log


De IP variabele heeft dus verschillende ip-adressen op één regel. Stel nou dat 192.168.1.1 down is, dan is het wel handig dat ik dus kan loggen dat alleen 192.168.1.1 down is en dat er ook alleen een mailtje gestuurd wordt over 192.168.1.1 en niet over 192.168.1.2. Die is immers bereikbaar.

Verder hoeft er niets bijgehouden worden. Ik wil niet weten of de DNS werkt bij wijze van. Ik wil gewoon weten is hij bereikbaar ja of nee.

edit:

Ik weet dat /tmp/file.log op deze manier erg groot kan worden als elke minuut dit script draait. Daar is al een oplossing voor.

[ Voor 6% gewijzigd door LollieStick op 09-09-2009 15:21 ]


Verwijderd

@CyBer

Met nagios kan je wel een beetje meer he ;)

diskspace monitoring, monitoring op service nivo, cpu monitoring, uptime en nog 10.000 andere dingen.

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

nofi; maar kun je dit niet opvangen via zabbix?

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op woensdag 09 september 2009 @ 15:14:
@CyBer

Met nagios kan je wel een beetje meer he ;)

diskspace monitoring, monitoring op service nivo, cpu monitoring, uptime en nog 10.000 andere dingen.
Mja, true. Maar als je disk space en je cpu en weetik 't ok zijn maar je ISP is kapot ben je nog altijd fucked :P

All my posts are provided as-is. They come with NO WARRANTY at all.


  • funz
  • Registratie: Augustus 2009
  • Laatst online: 06-12-2011
Ik ben het met StachelDraht eens, verdiep je eens in Nagios, het is vrij eenvoudig te installeren. En bied behalve mails ook de mogelijkheid om live mee te kijken naar de status, grafieken over de status, en de mogelijkheid om (met een beetje moeite) een sms te laten versturen.

Ook krijg je niet gelijk 100 mailtjes als je even een netwerkhikje hebt, nagios controleert eerst x (standaard 3) of de host nog steeds down is, voordat deze begint te mailen.

Het kost misschien initieel iets meer moeite om de logica te snappen, maar aangezien het script er ook nog niet ligt ben je die moeite toch kwijt. Maar de toegevoegde waarde achteraf is zeker aanwezig. Ik heb bij een groot bedrijf zelfs gezien dat uit nagios de SLA-maandrapportages kwamen. Of dat van tientallen mailservers tegelijkertijd werd gecontroleerd of ze op een blacklist stonden.

Meer informatie: http://www.nagios.org/
Documentatie: http://nagios.sourceforge.net/docs/3_0/toc.html
Quickstart installation guides: http://nagios.sourceforge.net/docs/3_0/quickstart.html

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Ik ben een enorme fan van Nagios, maar denk niet dat TS daar op zit te wachten. Soms is een simpel scriptje vooldoende. Probleem is dat je dan wel een beetje moet kunnen scripten.

Nagios is prachtig als basis, als engine die je checks scheduled en resultaten interpreteert. Maar dan nog kom je al gauw op een punt waar je zelf je plugins wilt aanpassen of schrijven, en dan zit je toch vaak te scripten. (Ik heb een shitload aan Nagios plugin scriptjes gemaakt).

De algemene tip aan de TS is dus, wat mij betreft, dat hij zich het beste eens kan verdiepen in shell scripting, ook al zou hij in een later stadium misschien wel met Nagios aan de slag willen.

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Tip:
Ik zou Bash vergeten en met Perl starten. Perl is veel eenvoudiger en logischer in te programmeren dan in Bash. En het is multi-platform. En je kan eventueel in Perl ook Bash/systeem commandos uitvoeren.
Perl zit zeg maar een stapje hoger dan Bash, dus ietsje langzamer, maar wel veel makkelijker als starter te lezen en veel modules voor down te loaden.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

gepebril schreef op donderdag 10 september 2009 @ 03:34:
Ik zou Bash vergeten en met Perl starten.
Of Awk of Python of Lua of desnoods Php. In die talen is het een fluitje van een cent; in bash moet je hemel en aarde bewegen om het voor elkaar te krijgen.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

LollieStick schreef op woensdag 09 september 2009 @ 15:13:
[...]

Ik heb dus zoiets:

code:
1
2
IP="192.168.1.1 192.168.1.2"     # ik kan hier eventueel nog 100 ip-adressen toevoegen.
ping  -c1 $IP | grep -A1 statistics >> /tmp/file.log
Als je toch al een variabele hebt met alle IP adressen spatie-gescheiden, dan kan je er met een simpele for-loop doorheen banjeren:

code:
1
2
3
4
5
6
7
#!/bin/bash
IPLIST="123.456.789.001 123.456.789.002 123.456.789.003"

for IP in ${IPLIST}
do
        echo "IP adres = ${IP}"
done


In plaats van de 'echo', kan je natuurlijk andere commando's gebruiken; bijvoorbeeld een ping naar het bewuste IP-adres waarna je kijkt wat het resultaat is, en aan de hand daarvan een mailtje stuurt naar een bepaald adres....

Edit: dus eigenlijk wat Cherwin al een tijdje terug heeft gezegd. 8)7

[ Voor 4% gewijzigd door Verwijderd op 10-09-2009 09:26 ]


  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 23:25

CAPSLOCK2000

zie teletekst pagina 888

1. Als je die lijst met pings zelf zou moeten/kunnen maken kun je daar beter fping voor gebruiken dan het gewone ping. fping is speciaal bedoeld om in dit soort scriptjes gebruikt te worden. Dat is mooier en handiger dan werken met een voorgegenereerde lijst pings.

$ fping google.com jan piet klaas

2. Op grond van jouw specificaties denk ik dat je geen informatie over de ip-adressen hoeft bij te houden. Op het moment dat je ziet dat een adres niet bereikbaar is kun je direct mailen.


code:
1
2
3
4
5
offline=$(fping -u www.google.com www.tue.nl)
for host in $offline;
do 
  mail -u beheerder@werk.nl -s "$host is offline"
done

(uiteraard) niet getest.

Misschien is het handig als je een voorbeeld geeft van je input, want standaard ping geeft ouput over meerdere regels. Als je input er ongeveer zo uit ziet:

google off
msn on
hyves on
facebook off

en staat in "input.txt", dan zou je het volgende kunenn gebruiken:
code:
1
2
3
4
5
6
cat input.txt | while read host status; do 
  if [ "$status" == "off"];
  then
    mail -u beheerder@example.com -s "$host is offline"
  fi
done

This post is warranted for the full amount you paid me for it.


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

curly braces expansion?

code:
1
2
3
4
5
for i in 192.168.0.{001..255}; do
if ! ping -c1 $i; then
  echo dood
fi
done

[ Voor 6% gewijzigd door Rainmaker op 12-09-2009 16:25 ]

We are pentium of borg. Division is futile. You will be approximated.


  • swtimmer
  • Registratie: Augustus 2006
  • Laatst online: 21:35

swtimmer

Ontrafelt het leven!

Kan je gewoon niet met grep de juiste regels eruit parseren en die output een script inpipen die de mailings doet?
Pagina: 1