Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

PING shell script

hej har skapat följande script. När jag kör filen och den kommer till raden med att den ska öppna filen som den söka grepa med i så säger den att filen inte finns. Filen finns i samma mapp som jag kör scriptet ifrån. Uppskattar gärna hjälp med hur jag ska lösa detta problem

#!/bin/bash f="/host.txt" n="3" i="0" m="254" ip="192.168.1." while [ $i=$m ]; do h=$ip$n s="Nmap scan report for $h [host down]" if ping -c5 "$h" then echo$h echo "lycka" ((n=n+1)) echo $n ((i=i+1)) echo $i elif [grep -q 'Nmap scan report for $h [host down]' < $f] then echo"inget" ((n=n+1)) ((i=i+1)) else echo "Enhet $h svar inte" | mail -s "Problem med internet" mail adress ((n=n+1)) ((i=i+1)) fi echo $n"klar" echo $i"klar" done

Adderar [code]-taggar för mer läsbar kod. Bjuder på kodfärgning!
Trädvy Permalänk
Medlem
Plats
Östersund
Registrerad
Jan 2011

Den borde väl aldrig köra while loopen från första början, då 0 inte är 254

och i elif så bör pilen vara åt andra hållet då det ska in i f

CPU: i7 4770k Noctua NH-D14 MOBO: Maximus VI Hero GPU: GTX 980 RAM: 16 GB 1600 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G500s V.v. citera mig för att få svar.

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

som det ser ut så ligger host.txt direkt på roten? det ser lite knäppt ut: f="/host.txt"

Kanske du istället menade inuti aktuell katalog? dvs f="./host.txt"

eller varför skickar du inte in filen som ett argument istället?
file=$1

Samt, är det inte bättre att använda verktyg som redan finns istället för att återskapa hjulet?

prova: fping -g 192.168.1.0/24 > resultat.txt

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Som sagt, du har lite fel syntax. Du försöker hämta filen från root-katalogen och inte från katalogen du kör scriptet ifrån. För jag antar att scriptet inte ligger i root.

@Lexdale har vettiga kommentarer i övrigt.

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012
Skrivet av swehunter2000:

Den borde väl aldrig köra while loopen från första början, då 0 inte är 254

och i elif så bör pilen vara åt andra hållet då det ska in i f

Skrivet av Lexdale:

som det ser ut så ligger host.txt direkt på roten? det ser lite knäppt ut: f="/host.txt"

Kanske du istället menade inuti aktuell katalog? dvs f="./host.txt"

eller varför skickar du inte in filen som ett argument istället?
file=$1

Samt, är det inte bättre att använda verktyg som redan finns istället för att återskapa hjulet?

prova: fping -g 192.168.1.0/24 > resultat.txt

@swehunter2000 Har provat det du säger och då får jag istället felmeddelandet att kommandot inte finns
@Lexdale har provat lite olika sätt att hitta filen men nu har jag ändrat i scriptet och den letar filen i aktuell mapp. Det kan absolut vara lättare att använda program istället för att återskapa hjulet. Men jag kände att detta var ett bra sätt att lära mig att skriva bash script. Då det är något som jag behöver träna på. och när man inte vet om programet hur ska man göra då

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Bastian94:

...
echo$h
...

echo $h ska det nog vara, inte echo$h
Den raden genererar "command not found" som det är nu eftersom den försöker köra t.ex. kommandot "echo192.168.1.1" som inte är ett giltigt kommando pga att du missat ett mellanslag.

I övrigt ska det inte spela någon roll om du skriver f="./host.txt" eller f="host.txt" om filen i fråga ligger i samma mapp som du står i när du kör scriptet.

f="/host.txt" är däremot inte ok såvida du inte faktiskt lagt filen i roten av ditt filsystem.

Du bör för övrigt använda code-taggen runt din kod i den första posten så blir den mycket mer lättläslig.

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

@s0sdaf följande rad elif [grep -q 'Nmap scan report for $h [host down]' > $f]
ger mig felet [grep: kommandot finns inte
Skulle behöva hjälp med att lösa det problemet

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Bastian94:

@s0sdaf följande rad elif [grep -q 'Nmap scan report for $h [host down]' > $f]
ger mig felet [grep: kommandot finns inte
Skulle behöva hjälp med att lösa det problemet


Jaså, det var underligt för jag testade att köra scriptet själv och det gav inget sånt fel för mig. Vad kör du för distribution?

edit: Okej, jag tror det har att göra med att du inte har mellanslag mellan [ och grep, prova att lägga till det och se om det hjälper.

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

@s0sdaf rasbian en version av debian för raspberry pi

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Bastian94:

rasbian en version av debian för raspberry pi

Ok. Se mitt tidigare redigerade inlägg.

Tror för övrigt du ska köra med ( och ), inte [ ] eftersom du mäter upp resultatet av ett kommando för elif:en. Testa alltså

elif ( grep -q 'Nmap scan report for $h [host down]' < $f )

Du bör nog också använda " och inte ' då skalet inte kan expandera variabler inom single-quotes, alltså '

Så $h kommer inte bytas ut mot variabelns värde, utan förbli strängen $h.
Så om ovanstående exempel inte funkar, testa

elif ( grep -q "Nmap scan report for $h [host down]" < $f )

En annan sak också:

Förväntar du dig att det ska stå något i stil med

"Nmap scan report for 192.168.1.1 [host down]" i host.txt? Isåfall måste du sätta backslashes innan [ och ] i koden på den raden också. Alltså:

elif ( grep -q "Nmap scan report for $h \[host down\]" < $f )

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

Har gjort om scriptet och provar möjligheten att dela upp filen i array och matchar arrayen mot en given string. Då det tog alldelse för lång tid att använda grep för att söka igenom filen. Har dock slut på ideer för hur jag ska börja med att få scriptet att gå igenom loopen för att matcha arrayen. Bifogar mitt script igen och hoppas på ny bra ideer som kan hjälpa mig framåt.

#!/bin/bash f="./host" n="1" i="0" m="254" ip="192.168.1." readarray -t array < "host" while [ $i -lt $m ]; do h=$ip$n s="Nmap scan report for $h \[host down\]" if ping -c5 "$h" then echo $h echo "lycka" ((n=n+1)) echo $n ((i=i+1)) echo $i else for i in "${array[@]}" do if [ "$s" == "$i" ] then echo "inget" ((n=n+1)) ((i=i+1)) else echo "lycka" ((n=n+1)) echo $n ((i=i+1)) echo $i else for i in "${array[@]}" do if [ "$s" == "$i" ] then echo "inget" ((n=n+1)) ((i=i+1)) else echo "Enhet $h svar inte" | mail -s "Problem med internet" mail adress | echo "Mail" ((n=n+1)) ((i=i+1)) fi done ((n=n+1)) ((i=i+1)) echo "FEL" fi echo $ "klart" done

adderade code taggar
Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Bastian94:

Har gjort om scriptet och provar möjligheten att dela upp filen i array och matchar arrayen mot en given string. Då det tog alldelse för lång tid att använda grep för att söka igenom filen. Har dock slut på ideer för hur jag ska börja med att få scriptet att gå igenom loopen för att matcha arrayen. Bifogar mitt script igen och hoppas på ny bra ideer som kan hjälpa mig framåt.

#!/bin/bash f="./host" n="1" i="0" m="254" ip="192.168.1." readarray -t array < "host" while [ $i -lt $m ]; do h=$ip$n s="Nmap scan report for $h \[host down\]" if ping -c5 "$h" then echo $h echo "lycka" ((n=n+1)) echo $n ((i=i+1)) echo $i else for i in "${array[@]}" do if [ "$s" == "$i" ] then echo "inget" ((n=n+1)) ((i=i+1)) else echo "lycka" ((n=n+1)) echo $n ((i=i+1)) echo $i else for i in "${array[@]}" do if [ "$s" == "$i" ] then echo "inget" ((n=n+1)) ((i=i+1)) else echo "Enhet $h svar inte" | mail -s "Problem med internet" mail adress | echo "Mail" ((n=n+1)) ((i=i+1)) fi done ((n=n+1)) ((i=i+1)) echo "FEL" fi echo $ "klart" done

Tog det lång tid med grep säger du? Hur stor är host.txt egentligen? grep ska vara jättesnabbt.

Trädvy Permalänk
Medlem
Plats
No Place
Registrerad
Jun 2006

Tror du behöver byta ut några else.

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av So_it_goes:

Tror du behöver byta ut några else.

Instämmer, ser ut som några for-loopar avslutats med "else" istället för det korrekta "done".

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

@s0sdaf: Enligt ls -l på filen så säger den att den är en 0byte. Behöver grep en filen ändelse?

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Bastian94:

@s0sdaf: Enligt ls -l på filen så säger den att den är en 0byte. Behöver grep en filen ändelse?

Om filen är tom så är det knappast grep som är långsam, grep kommer inte göra nånting om det inte finns någon data att söka igenom. Vad det gäller filändelse så behövs det inte nånstans, det är bara där för att du som användare lättare ska kunna gissa vad filen innehåller, för datorn kvittar det. Men om du har skrivit dit en filändelse när du skapat filen måste du såklart skriva dit den också när du vill komma åt filen.

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

@s0sdaf filen är inte riktigt tom men den är så liten så att det inte märks. Vad kan då för att grep är segt?

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
Skrivet av Bastian94:

@s0sdaf filen är inte riktigt tom men den är så liten så att det inte märks. Vad kan då för att grep är segt?

Vad får dig att tro att det är grep-kommandot som är segt? Har du testat köra kommandot i terminalen eller kör du bara genom scriptet?

Trädvy Permalänk
Medlem
Registrerad
Dec 2016

Hej!

Ditt skript är en start, men det är långt ifrån klart.
Som några redan påpekat så använder du massa "else", medan när du använder "if" så kan du bara använda "else" en gång, dvs en else per if-sats.

I shell-skript så måste du dessutom avsluta varje if-sats med en "fi",

if [ "a" == "b" ]; then echo "hej" else echo "nej" fi

Samma gäller när du använder for eller while, dessa måste avslutas med "done",

while true; do echo "hej" sleep 1 done

for i in $array; do echo $i done

Ett tips för att felsöka ditt shellskript är att använda växeln "-x" när du exekverar skriptet, t.ex,

$ sh -x dittshellskript.sh

Alternativt att du använder "#!/bin/bash -x" högst upp i ditt shellskript, dvs i själva filen, så istället för att starta filen med bara,

#!/bin/bash

Så lägger du till "-x",

#!/bin/bash -x

När du då kör ditt skript,

$ ./dittshellskript.sh

Så kommer du få output på ett liknande sätt:

+ f=./host + n=1 + i=0 + m=254 + ip=192.168.1. test.sh: 7: test.sh: cannot open host: No such file + readarray -t array test.sh: 7: test.sh: readarray: not found test.sh: 32: test.sh: Syntax error: "else" unexpected (expecting "fi")

Trädvy Permalänk
Medlem
Plats
Götene
Registrerad
Jul 2012

Hej,
Jag har löst mitt problem.
Tack för all er hjälp