Это вполне выполнимо только с помощью конфигурации ssh, без необходимости использовать отдельные псевдонимы для lan и wan или создания дополнительных портов для переадресации. (Но вам, естественно, нужен какой-то способ определить, находитесь ли вы внутри локальной сети или нет)
В ~/.ssh/config
, вы хотите добавить что-то вроде этого:
Match host raspi exec "am_i_outside_of_my_lan"
HostName 12.345.67.89
Port 1234
Вместо этого am_i_outside_of_my_lan
вы захотите разместить команду, которая определяет, находитесь ли вы в своей домашней сети или нет, и возвращает с 0 кодом выхода, если вы находитесь за ее пределами, и что-то еще в противном случае.
host
Условие, вероятно , само за себя, но exec
состояние требует некоторого объяснения: Это соответствует только тогда , когда данная команда возвращается с кодом выхода 0, то есть. Нет ошибки.
Другими словами, эта host raspi
часть ограничивает это правило, когда вы пытаетесь подключиться к хосту raspi, и exec "am_i_outside_my_lan"
еще больше ограничивает его, чтобы оно применялось только при подключении извне вашей домашней сети. Таким образом, внутри вашей домашней сети ssh user@raspi
происходит именно то, что обычно, но вне этого правила совпадают, и вместо этого это эквивалентно ssh -p 1234 user@12.345.67.89
.
Что касается того, что использовать вместо этого am_i_outside_of_my_lan
, это полностью зависит от вашей настройки. Я предлагаю размещать команды в отдельном скрипте вместо того, чтобы пытаться писать их в строке, потому что цитата кажется немного трудной для понимания.
Лично я использовал следующий скрипт на Python, чтобы определить, нахожусь ли я в своей собственной сети: (Поскольку мое доменное имя преобразуется в локальный ip внутри моей собственной сети)
#! /usr/bin/env python
import socket, sys
sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))
Если у вас нет аналогичной настройки, возможно, вам придется заняться чем-то другим. (Например, вы можете посмотреть имя беспроводной сети, к которой вы подключены, или даже запросить какой-нибудь сервис what-is-my-ip, чтобы получить внешний ip сети, к которой вы подключены)