Bash-Einzeiler-While-Schleife zum SSH in die interne oder externe IP

Bash-Einzeiler-While-Schleife zum SSH in die interne oder externe IP

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

verwandte Informationen