Ich möchte eine While-Schleife auf meinem Terminalbildschirm haben, die jede Sekunde versucht, sich per SSH mit meinem Server zu verbinden. Im Moment sieht das ungefähr so aus:
while true; do echo INTERNALIP && date >> $HOME/server.log &&\
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
date;\
sleep 1; done
Ich verfüge über eine ähnliche Bash- while
Schleife für das SSH-Verfahren auf derselben Maschine, verwende dabei aber die externe IP-Adresse. Über diese Methode verbinde ich mich, wenn ich mich nicht im Büronetzwerk befinde:
while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
date;\
sleep 1; done
Ich möchte beides in einem einzigen Einzeiler zusammenfassen, der (1) zuerst versucht, eine Verbindung über INTERNALIP herzustellen, und, wenn das fehlschlägt, dann versucht, eine Verbindung über EXTERNALIP herzustellen. Ich bin mit Bedingungssätzen in Bash nicht so vertraut, daher bin ich mir nicht sicher, wie das geht.
Irgendwelche Ideen?
Antwort1
Warum verwenden Sie nicht einfach die folgende Zeile in Ihrer Schleife:
ssh [email protected] || ssh [email protected]
So wie ich das verstehe, wird nur dann ein zweiter SSH ausgelöst, wenn der SSH zu 192.168.1.10 fehlschlägt. Ist das nicht das, was Sie wollen?
Alle anderen Details zu SSH-Optionen, Protokollen usw. habe ich weggelassen.
Noch besser wäre vielleicht so etwas:
( ssh [email protected] && echo INTERNALIP ) || ( ssh [email protected] && echo EXTERNALIP )
Dies sollte sich auch um die Protokolle kümmern und ist ein Einzeiler. (Ich habe im Moment keine Gelegenheit, es zu testen, also seien Sie gewarnt.)
Antwort2
Vorausgesetzt, Ihr Skript tut genau das, was Sie wollen, würde ich etwa Folgendes ausführen:
while true; do echo INTERNALIP && date >> $HOME/server.log && \
if [ "`find .external.pid -mtime 1 | egrep '.*'`" == "" ]; then \
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
if [ $? == 255 ]; then touch -d "-1 day" .external.pid; fi; \
else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
if [ $? == 255 ]; then rm .external.pid; fi; \
fi; \
date; \
sleep 1; done
Dies verwendet eine .external.pid, um zu verfolgen, welcher Server verwendet werden soll.
PS: Sie würden wahrscheinlich stattdessen dies verwenden:
while true; do echo INTERNALIP && date >> $HOME/server.log && \
if [ "`find .external.pid -atime +1s | egrep '.*'`" == "" ]; then \
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 -o [email protected] 'date'; \
if [ $? == 255 ]; then touch .external.pid; fi; \
else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected] 'date'; \
if [ $? == 255 ]; then rm .external.pid; fi; \
fi; \
sleep 1; done