Це цілком можливо з використанням лише конфігурації 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.'))
Якщо у вас немає подібних налаштувань, можливо, доведеться зробити щось інше. (Наприклад, ви можете подивитися ім’я бездротової мережі, до якої ви підключені, або навіть запитати якусь послугу "що є моя", щоб отримати зовнішній ip мережі, до якої ви підключені)