Как проверить, используется ли туннель s sh? - PullRequest
1 голос
/ 25 мая 2020

Я использую сценарий python для автоматического открытия туннелей и ищу способ узнать, используется ли туннель.

python код:

    from sshtunnel import SSHTunnelForwarder
    server = ( SSHTunnelForwarder(
        'main_server_ip',
        ssh_username="username",
        ssh_pkey="~/.ssh/id_rsa",
        local_bind_address=('0.0.0.0', randomPort),
        remote_bind_address=(host_ip, 3389)
        ) )

Я использовал sshtunnel options:

server.skip_tunnel_checkup = False
server.start()
server.check_tunnels()
print(server.tunnel_is_up, flush=True)

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

мне нужна опция, чтобы узнать, используется ли туннель \ не используется , чтобы я мог закрыть его, если он не использовался в течение времени X.

Туннели предназначены для RDP-соединения, и для меня используется, если кто-то подключен через туннель к RDP-соединению и работает над ним. если сеанс rdp закрыт, это означает, что туннель не используется.

Спасибо

1 Ответ

0 голосов
/ 27 мая 2020

Это было мое решение:

import subprocess, re, socket

ip_address = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) + ["no IP found"])[0]

ports_used = []
p = subprocess.Popen(["netstat", "-na"], stdout=subprocess.PIPE)
out = p.stdout.read()
lines = out.decode('utf-8').split('\n')
for line in lines:
    is_open = re.match(rf'tcp.*{ip_address}:([0-9][0-9]*).*ESTABLISHED\s*$', line)
    if is_open is not None:
        ports_used.append(is_open[1])

Разрушение команды netstat, чтобы найти на машине все ESTABLISHED порты, а оттуда фильтровать по ip хоста \ контейнера, а затем сопоставить его с портами, которые я знаю открыты в моих данных БД. (s sh туннельные порты, которые являются активными \ открытыми, перечислены в моей базе данных.) Таким образом, я мог видеть, если порт не находится в is_open означает, что соединение было закрыто.

...