У меня возникли проблемы при запуске SSH-туннеля с HTTP-сервера RPC, написанного на Python.
Существует простой HTTP-сервер RPC, написанный на Python, на основе Python BaseHTTPServer.
Как часть одной из служб, я хотел бы запустить SSH-туннель от сервера RPC к удаленной машине. Я использовал os.system для запуска туннеля SSH в скрипте Python, вызываемом вызовом RPC
os.system("ssh -f -n -N -L 127.0.0.1:%d:localhost:%d user@%s" % (6800, 9000, "remote.machine"))
На первый взгляд все выглядит хорошо, поскольку туннель запущен, и я могу им воспользоваться, но я заметил одну вещь. В дополнение к прослушиванию через порт 6800 SSH также начал прослушивать порт 8001 (порт, на котором работает HTTP-сервер RPC).
Вот вывод команды lsof относительно сервера RPC и SSH:
rpc.py 27763 usern 5u IPv4 102130428 TCP 127.0.0.1:8001 (LISTEN)
ssh 1951 usern 14u IPv4 102149728 TCP 127.0.0.1:6800 (LISTEN)
ssh 1951 usern 5u IPv4 102130428 TCP 127.0.0.1:8001 (LISTEN)
Все работает до перезапуска сервера RPC. Во время перезапуска сервер RPC вынужден закрыть свое соединение с прослушивающим сокетом, но соединение SSH остается открытым, и сервер RPC не может снова запуститься на том же порту.
Кажется, что SSH-туннель также каким-то образом ассоциируется с fd прослушивающего сокета RPC-сервера.
Может кто-нибудь дать подсказки, как настроить SSH-туннель из сценария, при этом он прослушивает только предполагаемый порт (6800 в этом примере).