Date: Tue, 19 Mar 2024 08:30:00 +0100 (CET) Message-ID: <1248434713.1608.1710833400537@832b484887d6> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_1607_888721198.1710833400535" ------=_Part_1607_888721198.1710833400535 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
Dieses Bash-Script durchsucht das a= ngeschlossene Netzwerk nach dem unter HOSTNAME angegebenen Ger=C3= =A4t. Bei Verbinden/Trennen wird automatisch der passende Status geset= zt. Daf=C3=BCr m=C3=BCssen die Variablen STATUSURL_CONNECTED/STATUSURL_= DISCONNECTED an die im Statusgeber zu findende URL angepasst werd= en.
Das Paket arp-scan wird zum Scannen des Netzwerks genutzt und m= uss falls n=C3=B6tig zuvor installiert werden.
sudo ap= t-get install arp-scan
Falls der Paketmanager brew noch nicht installiert ist, kann= er =C3=BCber folgenden Befehl installiert werden:
/usr/bi= n/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/= master/install)"
Anschlie=C3=9Fend kann arp-scan geladen werden:
brew in= stall arp-scan
Das Bash-Script kann bspw. =C3=BCber nano als divera24= 7-wlan-scanner.sh im Home-Verzeichnis erstellt werden.
nano ~/= divera247-wlan-scanner.sh
Anschlie=C3=9Fend folgenden Inhalt einf=C3=BCgen und die Datei =C3=BCber= Strg+O speichern und =C3=BCber Strg+X den Editor schlie=C3=9Fen.
#!/bin/s= h DEBUG=3Dfalse # Enable debug output STATUSURL_CONNECTED=3D"https://www.divera247.com/statusgeber.html?status=3D= 1&accesskey=3D..." # Replace with your personal status url if connected STATUSURL_DISCONNECTED=3D"https://www.divera247.com/statusgeber.html?status= =3D2&accesskey=3D..." # Replace with your personal status url if discon= nected HOSTNAME=3D"divera247-phone" # Use `arp -a` to get your devicename NETWORK_INTERFACE=3D"en0" # Use `ifconfig` to get you connected network ada= pter ACK_THRESHOLD=3D3 # Minimum times device must not be reachable to be marked= as disconnected ACK_COUNTER=3D0 # Number of times device did not acknowledge DELAY=3D15 # Delay between network scans CONNECTED=3Dfalse # Initial state function connectionStateToggled { if [ "$CONNECTED" =3D true ]; then echo "$HOSTNAME connected" # Set connected status CURL_OUTPUT=3D$(curl --silent -w "\n\nStatus Code: %{http_code}\n\n" "$= STATUSURL_CONNECTED" 2>&1) STATUS_CODE=3D$(echo "$CURL_OUTPUT" | grep "Status Code") # Print server output in error case if [ $DEBUG =3D true ] || [[ "$STATUS_CODE" !=3D *"200"* ]]; then echo "$CURL_OUTPUT" fi else echo "$HOSTNAME disconnected" # Set disconnected status CURL_OUTPUT=3D$(curl --silent -w "\n\nStatus Code: %{http_code}\n\n" "$= STATUSURL_DISCONNECTED" 2>&1) STATUS_CODE=3D$(echo "$CURL_OUTPUT" | grep "Status Code") # Print server output in error case if [ $DEBUG =3D true ] || [[ "$STATUS_CODE" !=3D *"200"* ]]; then echo "$CURL_OUTPUT" fi fi } while true; do HOSTNAMES_FROM_ROUTER=3D$(arp -a) # Check if device is in cached list and get IP address from it IP_OF_DEVICE=3D$(echo "$HOSTNAMES_FROM_ROUTER" | grep $HOSTNAME | awk -F = '[()]' '{print $(NF-1)}') if [[ ! -z $IP_OF_DEVICE ]]; then # Scan network to check if device is really still connected NETWORKSCAN=3D$(arp-scan --interface=3D$NETWORK_INTERFACE --localnet) if [[ "$NETWORKSCAN" =3D=3D *"$IP_OF_DEVICE"* ]]; then $DEBUG && echo "Found $HOSTNAME as $IP_OF_DEVICE in network s= can" # Device is reachable by network scanner # If previously have been disconnected, set status at home if [ "$CONNECTED" =3D false ]; then CONNECTED=3Dtrue ACK_COUNTER=3D0 connectionStateToggled fi else $DEBUG && echo "$HOSTNAME did not respond to network scan" # Device is not reachable by network scanner ACK_COUNTER=3D$((ACK_COUNTER + 1)) # If device didn't respond ACK_THRESHOLD times: set status or ignore if (( ACK_COUNTER >=3D ACK_THRESHOLD )) && [ "$CONNECTED" = =3D true ]; then CONNECTED=3Dfalse connectionStateToggled fi fi else $DEBUG && echo "$HOSTNAME wasn't found in routers list of known= devices" # Device is not in cached list, so it has been disconnected a while ago ACK_COUNTER=3D$((ACK_COUNTER + 1)) if (( ACK_COUNTER >=3D ACK_THRESHOLD )) && [ "$CONNECTED" = =3D true ]; then CONNECTED=3Dfalse connectionStateToggled fi fi # Wait some time before next iteration, otherwise devices could not respo= nd to scan sleep $DELAY done
Das Programm muss nun als root ausgef=C3=BChrt werden= , also =C3=BCber:
sudo di= vera247-wlan-sniffer.sh
Wenn die Statusgeber-URL, der Hostname und der Netzwerkadapter des Ger= =C3=A4ts korrekt angepasst wurden, sollte nun automatisch der passende Stat= us gesetzt werden und eine entsprechende Nachricht vom Programm ausgegeben = werden.
Verz=C3=B6gerung bei der Erkennung
=Das Skript scannt nur alle 15 Sekunden das Netzwerk, bei einer h=C3=B6he= ren Frequenz antworteten die Ger=C3=A4te nur noch sehr unzuverl=C3=A4ssig. = Um false positives zu vermeiden kann =C3=BCber ACK_THRESHOLD= em> bestimmt werden, wie oft das Ger=C3=A4t nicht erreichbar sein muss, bis= der Status gesetzt wird.
Der Hostname des Ger=C3=A4tes kann vom eingestellten abweichen. Der Befe= hl arp -a zeigt einem die vom Router festgelegten Hostnames a= n. Dar=C3=BCber kann der eigene zur Identifizierung herausgefunden werden (= bspw. divera247-phone.fritz.box) und in der Variablen HOSTNAME eingetragen werden.
Standardm=C3=A4=C3=9Fig wird en0 als Netzwer= kadapter zur =C3=9Cberpr=C3=BCfung genutzt. Der Befehl ifconfig<= /em> zeigt einem die Namen der eigenen Netzwerkadapter an, falls n=C3= =B6tig kann die Variable NETWORK_INTERFACE entsprechend angep= asst werden.
Zum Testen wird empfohlen die Variable DEBUG au= f true zu setzen und DELAY herabzusenken.