Permalänk
Inaktiv

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!
Permalänk
Medlem

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

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem

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

Permalänk
Hedersmedlem

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.

Permalänk
Inaktiv
Skrivet av Haptic:

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

@Haptic 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å

Permalänk
Medlem
Skrivet av anon198674:

...
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.

Permalänk
Inaktiv

@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

Permalänk
Medlem
Skrivet av anon198674:

@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.

Permalänk
Inaktiv

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

Permalänk
Medlem
Skrivet av anon198674:

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 )

Permalänk
Inaktiv

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
Permalänk
Medlem
Skrivet av anon198674:

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.

Permalänk

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

Permalänk
Medlem
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".

Permalänk
Inaktiv

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

Permalänk
Medlem
Skrivet av anon198674:

@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.

Permalänk
Inaktiv

@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?

Permalänk
Hedersmedlem
Skrivet av anon198674:

@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?

Permalänk

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")

Permalänk
Inaktiv

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