Многопролетный туннель:

Я открываю туннель к удаленному серверу через сервер переходов.

ssh ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Теперь, когда я открываю соединение с localhost:port он переходит к jump:port который, в свою очередь, пересылает к remote:port

Запустите локальный туннель в фоновом режиме:

Проблема в том, что он открывает оболочку на remote , тогда как я хочу, чтобы туннель работал в фоновом режиме.

Поэтому я добавляю опцию -f в мой локальный туннель, чтобы запросить его запуск в фоновом режиме

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Это, однако, возвращает ошибку:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Предположительно, эта ошибка исходит из туннеля от jump к remote , и вызвана тем, что stdin закрыт, когда мой локальный туннель демонизирован.

Скажите удаленному туннелю, что я не буду запускать команду:

Затем я попытался запустить jump-> remote tunnel с -N чтобы сказать, что я не собираюсь запускать удаленную команду.

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh -N ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

Это прекрасно работает - туннель работает в фоновом режиме, и я могу успешно подключиться к remote:port через порт localhost:port .

Проблема:

Проблема в том, что я хочу закрыть туннели.

Если я отправлю сигнал уничтожения в pid моего локального ssh-туннеля, он закроется, но ssh-туннель, работающий при jump продолжать работать.

Кажется, что когда я демонизирую свой локальный туннель, туннель при jump также демонизируется.

Вопрос:

Можно ли запустить мой локальный туннель в фоновом режиме, но когда я его убиваю, он отключает все туннели, которые он породил на всех удаленных серверах?

1 ответ1

1

Запустите оба ssh -s локально. Сначала подключитесь к серверу прыгать и создать туннель , который позволит вам ssh на удаленный хост с локального компьютера:

ssh -fN $jump_host -l $jump_host_user -L ${helper_port}:${remote_host}:22

Затем используйте этот туннель для подключения к удаленному хосту, создавая нужный туннель; еще с локального компьютера:

ssh -fN localhost -p $helper_port -l ${remote_host_user} -L ${port}:localhost:${port}

Поскольку два процесса ssh являются локальными, вы можете kill их оба в любое время; но я думаю, что убийство первого должно быть достаточно, попробуйте.


Заметки:

  • Этот подход может быть неудобен, если ваш "вторичный" ssh полагается на конкретную конфигурацию, хранящуюся в ssh_config на хосте перехода.
  • Я использовал строчные имена переменных; увидеть этот ответ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .