Dies ist perfekt mit nur der SSH-Konfiguration möglich, ohne dass separate Aliase für LAN und WAN verwendet oder zusätzliche Ports für die Weiterleitung erstellt werden müssen. (Aber Sie brauchen natürlich eine Möglichkeit, um festzustellen, ob Sie sich in Ihrem LAN befinden oder nicht)
In ~/.ssh/config
möchten Sie Folgendes hinzufügen:
Match host raspi exec "am_i_outside_of_my_lan"
HostName 12.345.67.89
Port 1234
Anstelle der am_i_outside_of_my_lan
Sie wollen einen Befehl setzen, ob Sie , wenn Sie außerhalb, und etwas anderes sonst sind in Ihrem Heimnetzwerk oder nicht, und kehrt mit 0 Exit - Code bestimmt.
Die host
Bedingung ist wahrscheinlich selbsterklärend, aber die exec
Bedingung verdient eine Erklärung: Sie stimmt nur überein, wenn der angegebene Befehl mit dem Exit-Code 0 zurückgegeben wird, d. H. kein Fehler.
Mit anderen Worten, dies ist der host raspi
Teil, auf den diese Regel beschränkt ist, wenn Sie versuchen, eine Verbindung zum Host-Raspi herzustellen, und der exec "am_i_outside_my_lan"
weitere, der sie so einschränkt, dass sie nur gilt, wenn Sie eine Verbindung von außerhalb Ihres Heimnetzwerks herstellen. Innerhalb Ihres Heimnetzwerks ssh user@raspi
macht es also genau das, was es normalerweise tun würde, aber außerhalb davon stimmt die Regel überein und es macht stattdessen das Äquivalent von ssh -p 1234 user@12.345.67.89
.
Was anstelle von verwendet werden am_i_outside_of_my_lan
soll, hängt ganz von Ihrem Setup ab. Ich schlage vor, die Befehle in einem separaten Skript zu platzieren, anstatt zu versuchen, sie inline zu schreiben, da das Zitieren etwas schwierig zu sein scheint.
Persönlich habe ich das folgende Python-Skript verwendet, um festzustellen, ob ich mich in meinem eigenen Netzwerk befinde: (Da mein Domain-Name in eine lokale IP in meinem eigenen Netzwerk aufgelöst wird)
#! /usr/bin/env python
import socket, sys
sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))
Wenn Sie kein ähnliches Setup haben, müssen Sie möglicherweise etwas anderes tun. (Sie können beispielsweise den Namen des drahtlosen Netzwerks anzeigen, mit dem Sie verbunden sind, oder sogar einen Dienst für meine IP-Adresse abfragen, um die externe IP-Adresse des Netzwerks abzurufen, mit dem Sie verbunden sind.)