Jest to doskonale wykonalne tylko z konfiguracją ssh, bez konieczności używania osobnych aliasów dla lan i wan lub tworzenia dodatkowego portu do przodu. (Ale oczywiście potrzebujesz sposobu, aby wykryć, czy jesteś w swojej sieci, czy nie)
W ~/.ssh/config
, będziesz chciał dodać coś takiego:
Match host raspi exec "am_i_outside_of_my_lan"
HostName 12.345.67.89
Port 1234
Zamiast tego am_i_outside_of_my_lan
będziesz chciał umieścić polecenie określające, czy jesteś w sieci domowej, czy nie, i zwraca kod wyjścia 0, jeśli jesteś poza nim, i coś innego.
host
Warunek jest chyba oczywiste, ale exec
gwarantuje, stan niektórych wyjaśnienie: Pasuje tylko wtedy, gdy podane zwraca polecenie z kodem wyjścia 0, tzn. żaden błąd.
Innymi słowy, to, co to robi, polega na tym, że host raspi
część ogranicza tę regułę do, gdy próbujesz połączyć się z raspi hosta, a exec "am_i_outside_my_lan"
dodatkowo ogranicza ją tak, że ma ona zastosowanie tylko wtedy, gdy łączysz się spoza sieci domowej. Tak więc wewnątrz sieci domowej ssh user@raspi
działa dokładnie tak, jak normalnie, ale poza nią reguła jest zgodna, a zamiast niej odpowiada ssh -p 1234 user@12.345.67.89
.
Jeśli chodzi o to, czego użyć zamiast am_i_outside_of_my_lan
, zależy to całkowicie od twojej konfiguracji. Sugeruję umieszczenie poleceń w osobnym skrypcie zamiast wpisywania go w wierszu, ponieważ cytowanie wydaje się nieco trudne do poprawnego.
Osobiście użyłem następującego skryptu Python, aby wykryć, czy jestem w mojej własnej sieci: (Ponieważ moja nazwa domeny rozwiązuje się na lokalny adres IP wewnątrz mojej sieci)
#! /usr/bin/env python
import socket, sys
sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))
Jeśli nie masz podobnej konfiguracji, być może będziesz musiał zrobić coś innego. (Na przykład możesz spojrzeć na nazwę sieci bezprzewodowej, z którą jesteś podłączony, lub nawet zapytać o usługę what-is-my-ip, aby uzyskać zewnętrzny adres ip sieci, z którą jesteś podłączony)