staging.inyokaproject.org

Ping in Schleife -> nur der erste durchlauf gibt das richtige Ergebnis

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

Jan_Koenig32

Anmeldungsdatum:
31. Juli 2018

Beiträge: 1

Hallo,

ich versuche mich an einem Script für meinen Pi auf dem u.a. ein osmc und ein VPN-Client läuft. Ziel ist es, beim ersten Start eine VPN Verbindung aufzubauen und anschliessend 1-2 smb-shares einzubinden.

kurz und kanpp;

 

while true
do

Ping über tun0 an den VPN-Host zu schicken, 
wenn ok     -> fertig
wenn Fehler -> VPN Client neustarten und ping erneut senden
                  wenn ok     -> führe actionen durch (Laufwerke verbinden, Textausgabe auf TV ...)
                  wenn Fehler -> Meldung machen, warten und von vorne.
done

Beim ersten durchlauf funktioniert alles wie gedacht aber bei den folgenden wird der ping stehts bestätigt, auch wenn das Ziel nicht erreichbar ist.

#!/bin/bash

# Ziel für Ping
target="192.168.0.1"

# Ausgaben log, shell und $VPNSTATE
msg0="$target nicht erreichbar"
msg2="Verbindung zu $target erfolgreich aufgebaut"
msg1="VPN online"

while true
do

# Ping zu $target schicken 
echo "Sende Ping zu $target"; 
if echo $(ping -I tun0 -c 1 -W 1 $target) |grep bytes &>/dev/null;
	then
	# online
		echo "$target hat geantwortet"
		vpnstate="1"
		echo $msg1
		#### xbmc-send -a "Notification($date,$msg1)"
		#### ANPASSEN (msg xx)
	else
	# offline
		echo "shit"
		vpnstate="0"
		echo $msg0
		echo ""
		echo "Es wird versucht die VPN Verbindung aufzubauen ..."
		vpnc-disconnect
		sleep 1
		echo "VPN-Client wird neu gestartet ..."
		vpnc
		sleep 1

		if echo $(ping -I tun0 -c 1 -W 1 $target) |grep bytes &>/dev/null;
			then
			# online
				vpnstate="1"
				echo $msg2
				xbmc-send -a "Notification($date,$msg1)"
				# 
				# Action
				#
				
			else
				echo "Verbindungsaufbau zu $target fehlgeschlagen!"
				echo "Es wird weiterhin versucht die Verbindung zu $target herzustellen."
		fi
fi


if [ $vpnstate == "" ]
then
echo "VPNSTATE ist leer"
xbmc-send -a "Notification($date,$msg1)"

elif [ $vpnstate == 1 ]
then 
echo "VPNSTATE hat den Wert $vpnstate"
else
echo "nicht leer und nicht 1"
fi
sleep 5
done

Sicherlich sind noch einige anderen Fehler drin, vielleicht findet sich ja ein Profi der mich aufklären kann ☺

Grüße Jan

P.s. cat /proc/version gibt "Linux version 4.14.34-2-osmc (root@vero3-db) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1))" aus.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Hm, mal als erste Verbesserung, werte das Ergebnis des ping direkt aus, also statt:

if echo $(ping -I tun0 -c 1 -W 1 $target) |grep bytes &>/dev/null;

verwende lieber

if ping -I tun0 -c 1 -W 1 $target >/dev/null;

Das könnte auch schon des Rätsels Lösung sein, denn auch bei einem fehlgeschlagenen Ping kommt bytes in der Ausgabe des ping vor. Also lieber auf den Returncode des ping checken und nicht mit grep auf die Ausgabe arbeiten...

Und ich würde eher "-c 2" verwenden oder noch lieber "-c 4", denn je nach Netzwerkinfrastruktur kann ein ping auch mal in die hose gehen, auch wenn die Verbindung eigentlich schon noch da ist...

Antworten |