it-swarm.com.de

Erstellen Sie ein .sh-Skript, um zu überprüfen, ob eine SSH-Verbindung besteht. Wenn nicht, stellen Sie eine Verbindung her

Ich habe Probleme damit, etwas zu schreiben, von dem ich annehme, dass es ein einfaches Skript ist.

Grundsätzlich arbeite ich mit einem Computer, der sich hinter einem NAT verbirgt, auf den ich keinen Zugriff habe. Ich muss in diesen Computer eine SSH-Verbindung herstellen. Die einzige Möglichkeit besteht darin, eine Umleitung für den umgekehrten Port festzulegen, bei der dieser NATted-Computer zu Hause eine Verbindung zu meinem Server herstellt und einen Port für sich selbst umleitet. Anschließend kann ich einfach eine SSH-Verbindung herstellen über meinen Heimserver.

Das .sh-Skript wird alle 5 Minuten vom Computer bei der Arbeit ausgeführt. Ich möchte, dass es Folgendes ausführt:

Überprüfen Sie, ob eine aktive SSH-Verbindung zu meinem Server besteht. Wenn ja, tun Sie einfach nichts und beenden Sie das Skript.

Wenn keine aktive Verbindung erkannt wird, stellen Sie eine Verbindung her, indem Sie "ssh [email protected] -i key.priv" ausführen und das Skript beenden.

Wenn der SSH-Verbindungsversuch aus irgendeinem Grund blockiert, z. B. länger als 2 Minuten, beenden Sie das Skript mit Gewalt (nicht sicher, ob dies möglich ist, wenn nicht, muss es nicht vorhanden sein).

Vielen Dank für Ihren Rat.

3
Askerman

Angenommen, Sie verwenden den folgenden Befehl, um Ihre SSH-Verbindung herzustellen (ich würde es vorziehen, die Datei .ssh/config zu verwenden, die den Befehl ssh vereinfacht, dies ist jedoch nicht zwingend erforderlich):

ssh [email protected] -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
  • mit den Optionen -fTN wird die Verbindung in den Hintergrund gerückt. Ich habe diesen Hauptteil geschrieben, da diese Optionen für meinen Vorschlag unten von entscheidender Bedeutung sind.
  • mit der Option -R 2222:127.0.0.1:22 wird der umgekehrte Tunnel erstellt.
  • die Option -i $HOME/.ssh/id_rsa gibt die Identitätsdatei an.

Wir können ps -aux | grep "<our command>" | sed '$ d' verwenden, um zu überprüfen, ob die Verbindung hergestellt wurde oder nicht. Basierend darauf könnte unser Skript sein:

#!/bin/bash
SSH_COMMAND="ssh [email protected] -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi

Rufen Sie dieses Skript my_autossh auf, platzieren Sie es in ~/bin und machen Sie es ausführbar. Führen Sie dann crontab -e aus und fügen Sie den folgenden Job hinzu:

* * * * * $HOME/bin/my_autossh

Wenn Sie Cron nicht verwenden möchten, ändern Sie den scrip my_autossh folgendermaßen:

#!/bin/bash
SSH_COMMAND="ssh [email protected] -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

while true; do
    if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
    then eval $SSH_COMMAND
    else sleep 60
    fi
done

Und verwende Nohup, um es in den Hintergrund zu schieben:

Nohup my_autossh >/dev/null 2>&1 &

Lesen Sie auch:

3
pa4080