
У меня есть ноутбук, который, очевидно, может быть как внутри, так и вне моей домашней сети время от времени. Когда мне нужно подключиться по SSH к машине внутри моей сети, подключение довольно простое:
localhost $ ssh machinelearning
Когда я пытаюсь получить доступ к машине изснаружимоей сети, затем мне нужно подключиться к моему маршрутизатору, а затем использовать SSH оттуда:
localhost $ ssh router.mytotallyuniquedomain.com
router $ ssh machinelearning
Я помню, что для выполнения последней команды была комбинация клавиш ~/.ssh/config
, но сейчас я не могу вспомнить, какая именно.
Есть ли способ указать несколько имен хостов или типов подключений, чтобы при выполнении этого:
$ ssh machinelearning
SSH сначала попытается подключиться к machinelearning
хосту в локальной сети, а затем попытается создать туннель через router.mytotallyuniquedomain.com
, и все это без необходимости вводить длинное имя хоста?
решение1
Метод №1 — ProxyCommand и netcat
Для облегчения этой задачи я использую следующую настройку $HOME/.ssh/config
:
Host intserver1-o intserver2-o intserver3-o
ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p
Я тогда могу ssh intserver2-o
откуда угодно и попасть на этот внутренний сервер. Когда я дома в локальной сети я использую ssh intserver1
.
ПРИМЕЧАНИЕ:Для выполнения вышеописанного трюка требуется, чтобы nc
на extserver1 был установлен netcat().
Метод №2 - вложенный ssh
В качестве альтернативы вы также можете использовать этот метод:
$ ssh -t -l gatewayuser gatewayserver "ssh -l serveruser internalserver"
По сути, в этот метод вы вкладываете вызовы SSH.
Метод №3 - ProxyCommand и ssh -W
В более новых версиях SSH (5.4+) вы можете использовать ssh
вместо nc
этого коммутатор -W
.
Host TARGETHOST
ProxyCommand ssh -W %h:%p PROXYHOST
& %h
— %p
это макросы для имени хоста и порта, которые использовались для TARGETHOST
.