Многопролетный туннель в фоновом режиме; убийство локального туннеля не убивает удаленный туннель
Многопролетный туннель:
Я открываю туннель к удаленному серверу через сервер переходов.
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
туннель с -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 ответ
Запустить оба ssh
Локально. Сначала подключитесь к серверу прыжков и создайте туннель, который позволит вам 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
на прыжке хозяина. - Я использовал строчные имена переменных; увидеть этот ответ.