2017-04-11 4 views
0

Ich versuche, ein Bash-Skript zu erstellen.Saving Mac-Adresse in einer Variablen in einem Bash-Skript und verwenden Sie es, um nach Änderungen zu suchen

  1. Das Script fragt den Benutzer, eine IP-Adresse
  2. Das Skript dann greps den arp -a Befehl für die Zeile, die die IP-Adresse auf.
  3. Die MAC-Adresse wird als MAC-Variable gespeichert.
  4. Das Skript überprüft, dass die MAC-Adresse nicht geändert wurde.
#!/bin/bash 
# Xdetect 

echo "Welcome to Xdetect" 
echo "Enter IP address of device to monitor (usually default gateway)" 
read IP 

MAC=arp -a | grep $IP | awk {'print $4'} 
echo =$MAC 
while : 'arp -a | grep $IP | awk {'print $4'}' = $MAC 

do 
echo "Mac has not changed" 
sleep 2 
done 

Das Skript funktioniert nicht, es Schleifen und Echo MAC has not changed auch wenn die MAC-Adresse ändert.

Kurz bevor es Schleifen ein Fehler erscheint, dass: Xdetect.sh 9: Xdetect.sh: -a: not found

Wie kann ich dieses Problem beheben?

+2

Sie sollten ein gutes Tutorial lesen a), zum Beispiel der [BashGuide] (http://mywiki.wooledge.org/BashGuide) und/oder [Die Linux-Befehlszeile] (http: //linuxcommand.org/tlcl.php) und b) benutze http://www.shellcheck.net/ und behebe alles was es dir sagt. Erster Blick: Zuweisung der Ausgabe von Befehlen an Variablen, Parameterquotierung, Zitat für awk-Befehle, 'while' Schleifensyntax ... –

+0

' MAC = $ (arp -a | grep $ IP | awk '{print $ 4}') 'auch 'echo $ MAC' und' while ["$ (arp -a | grep $ IP | awk '{print $ 4}')" = "$ MAC"] ' – Arash

+0

Danke, das funktioniert perfekt. –

Antwort

2

Meinten Sie test anstelle des null-Befehls : in Ihrer while Aussage? So etwas wie dies, ohne die anti-Muster grep | awk:

MAC=$(arp -a | awk -v ip="$IP" '$2 == "("ip")" { print $4 }') 
echo "$MAC" 
while test $(arp -a | awk -v ip="$IP" '$2 == "("ip")" { print $4 }') = "$MAC"; do 
    echo "Mac has not changed" 
    sleep 2 
done 

Ihre Beobachtung, dass die Meldung „Mac hat sich nicht geändert“ gedruckt wird, wiederholt wird, weil : ist ein Null-Befehl immer wahr Rückkehr und ignoriert (nur erweitern) seine Argumente. Effektiv Ihr Code tut

while true; do 
    echo echo "Mac has not changed" 
    sleep 2 
done 
+1

Ein bisschen schlampig - da die IP dort als Regex behandelt wird und '.' ein Platzhalter ist, würde" 1.2.1.4 "mit" 132.143 "übereinstimmen, egal welche anderen Ziffern vorhanden sind. –

+0

@CharlesDuffy Guter Punkt, ich habe es zu einem String-Vergleich gemacht. – Jens

Verwandte Themen