如何检查是否正在使用ssh隧道?

问题描述 投票:1回答:1

我正在使用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选项:

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

但是它仅显示隧道是否处于打开状态\ active,未使用过,我在发布此消息之前一直在寻找一种方法,但所有示例仅显示了隧道处于激活状态\打开。

我需要一个选项来查看隧道是否为已使用\未使用,以便在X时间未使用它的情况下可以将其关闭。

隧道用于rdp连接,而对于我来说,是通过隧道将某人连接到rdp连接并对其进行操作。如果rdp会话关闭,则表示未使用隧道。

谢谢

python ssh-tunnel tunnel
1个回答
0
投票

这是我的解决方法:

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端口,并从那里通过host \ container ip进行过滤,然后将其与我知道在数据库数据中打开的端口进行匹配。(活动\打开的ssh隧道端口全部列在我的数据库中。)因此,我可以查看端口是否不在is_open中,这意味着连接已关闭。

© www.soinside.com 2019 - 2024. All rights reserved.