TCP-IP Связь через Python и открытый порт соединения SSH - PullRequest
0 голосов
/ 20 января 2012

Это новый вопрос для связи на основе TCP в Python. Я пытаюсь установить TCP-соединение между двумя * NIX-системами через туннель SSH и модуль сокетов Python. Я использовал два первых примера «эхо-сервер» и «эхо-клиент» с этого сайта Python MOTW: http://www.doughellmann.com/PyMOTW/socket/tcp.html.

Связь работала нормально в той же системе * NIX (HOST1), но произошла ошибка по туннелю ssh.

Я вошел во вторую * систему NIX с ssh -L 10000:HOST2:10000 USERNAME@HOST2. Затем я попытался установить связь таким же образом, запустив сценарий python для сервера на HOST2 и сценарий для клиента на HOST1. Это я получил на stderr:

python test_socket_client.py 
connecting to localhost port 10000
Traceback (most recent call last):
File "test_socket_client.py", line 10, in <module>
sock.connect(server_address)
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused

Когда я запускал сервер и клиент наоборот на HOST1 и HOST2 соответственно, я получал одно и то же сообщение.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Ваш сервер привязывает свой сокет к localhost: 10000 - это означает, что он прослушивает соединения только через интерфейс обратной связи. Командная строка SSH указывает SSH туннелировать локальные подключения к порту 10000 для подключений к HOST2: 10000. Ваша клиентская программа Python подключается к localhost: 10000, а затем удаленный конец канала SSH пытается подключиться к HOST2: 10000. Хотя это тот же порт и тот же компьютер, к которому привязан ваш сокет, это другой интерфейс, который ваш сокет не прослушивает.

Измените командную строку SSH на ssh -L 10000:localhost:10000 USERNAME@HOST2 или привязайте сокет прослушивания вашего сервера ко всем интерфейсам: server_address = ('', 10000). Пустая строка служит INADDR_ANY.

Конечно, то, что сказал Гэри ван дер Мерве, верно: SSH должен работать во время запуска клиентской программы Python на HOST1.

0 голосов
/ 20 января 2012

Я бы проверил, что ваш сервер слушает на хосте сервера, и что клиент ssh слушает на хосте клиента. Вы можете запустить netstat -tnlp, чтобы проверить это.

Вы уверены, что ваш ssh-клиент все еще открыт, когда вы запускаете его? Вам нужно либо запустить shh в одном терминале, а ваш клиент - в другом, либо запустить ssh -Nf, после чего ssh перейдет в фоновый режим после аутентификации.

...