Проверка ip: порт открыт на удаленном хосте - PullRequest
0 голосов
/ 02 марта 2020

У меня есть список серверов и портов ip: (внешние адреса), и мне нужно проверить, может ли каждый сервер подключиться к этим адресам.

Цикл файла и попытка открыть sshtunnel и выполнить подключение как показано ниже

tunnel=sshtunnel.SSHTunnelForwarder(
                                    ssh_host=host,
                                    ssh_port=22,
                                    ssh_username=ssh_username, 
                                    ssh_pkey=privkey,
                                    remote_bind_address=(addr_ip, int(addr_port)),
                                    local_bind_address=('0.0.0.0', 10022)
                                    #,logger=sshtunnel.create_logger(loglevel=10)        
                                )     
tunnel.start()
# use socket
try:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    res = s.connect(('localhost', 10022))
    print(res)
    #s.connect((addr_ip, int(addr_port)))
    s.close()
except socket.error as err:
    print('socket err:')
    print(err)
finally:
    s.close()

time.sleep(2)
tunnel.stop()

Когда я делаю это, ответ всегда равен 0 (т.е. носок может подключаться к локальной привязке), даже если пульт дистанционного управления неверен - однако sshtunnelforwarder выдает

ERROR   | Secsh channel 0 open FAILED: Network is unreachable: Connect failed
ERROR   | Could not establish connection from ('127.0.0.1', 10022) to remote side of the tunnel

Как мне сделать, чтобы моя команда сокетов проверяла, доступен ли адрес remote_bind_address?

Я пытался использовать telnetlib, но получил похожую проблему

код практически такой же, с замененным блоком сокетов на

tn=telnetlib.Telnet()
tn.open('localhost',10022)
tn.close()

Я относительно новичок для всех это, так еще учусь. Если есть лучший способ добиться того, что мне нужно, пожалуйста, дайте мне знать.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Установите атрибут skip_tunnel_checkup на False, чтобы включить проверку доступности удаленной стороны (по умолчанию она отключена для обратной совместимости):

tunnel.skip_tunnel_checkup = False

Добавление этого перед запуском туннель проверяет, запущена ли удаленная сторона, и выдает исключение, которое может быть обработано.

Удален мой код сокета.

1 голос
/ 02 марта 2020

Я не пробовал этого, но есть атрибут tunnel_is_up туннельного класса S SH, который согласно документации:

Опишите или сообщалось, что не другая сторона туннеля находится в рабочем состоянии (и мы должны закрыть его) или нет (пропустите отключение этого туннеля)

Пример его содержимого (это словарь):

{('127.0.0.1', 55550): True,  # this tunnel is up
('127.0.0.1', 55551): False}  # this one isn't

Так что вам не нужно устанавливать явное соединение самостоятельно.

Примечание: вам может потребоваться установить атрибут skip_tunnel_checkup в False (по умолчанию True для обратной совместимости) сначала перед настройкой туннеля, в противном случае tunnel_is_up может всегда сообщать True:

Когда skip_tunnel_checkup отключено или локальное связывание - это сокет UNIX, значение всегда будет True

Таким образом, код может выглядеть следующим образом:

tunnel=sshtunnel.SSHTunnelForwarder(
    # ...
)
tunnel.skip_tunnel_checkup = False
tunnel.start()

# tunnel.tunnel_is_up should be populated with actual tunnel status(es) now

В коде, который вы разместили, вы ' заново настраиваем туннель и затем просто открываем сокет для локальной конечной точки туннеля , что, по-видимому, открыт независимо от того, в каком состоянии находится туннель, поэтому он всегда успешно соединяется.

Другой подход - попытаться установить sh S SH соединение через туннель, но это paramiko.SSHclient Я думаю, вы упоминаете альтернативу в комментарии.

...