如何检查是否正在使用 ssh 隧道?
How to check if ssh tunnel is being used?
我正在使用 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)
但它只显示隧道是否打开\活动未使用,我在发布之前寻找了一种方法,但所有示例仅在隧道处于活动状态\打开时显示。
我需要一个选项来查看隧道是否已使用\未使用,因此如果它已经 X 时间未被使用,我可以将其关闭。
隧道用于 rdp 连接,对我来说,如果有人通过隧道连接到 rdp 连接并在其上工作,则使用隧道。如果 rdp 会话关闭则表示未使用隧道。
谢谢
这是我的解决方案:
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])
Ruining netstat 命令在机器上查找所有 ESTABLISHED
端口,并从那里通过 host\container ip 进行过滤,然后将其与我知道在我的数据库数据中打开的端口相匹配。
(活动\打开的 ssh 隧道端口都列在我的数据库中。)
那么,我可以看到端口是否不在 is_open
意味着连接已关闭。
我正在使用 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)
但它只显示隧道是否打开\活动未使用,我在发布之前寻找了一种方法,但所有示例仅在隧道处于活动状态\打开时显示。
我需要一个选项来查看隧道是否已使用\未使用,因此如果它已经 X 时间未被使用,我可以将其关闭。
隧道用于 rdp 连接,对我来说,如果有人通过隧道连接到 rdp 连接并在其上工作,则使用隧道。如果 rdp 会话关闭则表示未使用隧道。
谢谢
这是我的解决方案:
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])
Ruining netstat 命令在机器上查找所有 ESTABLISHED
端口,并从那里通过 host\container ip 进行过滤,然后将其与我知道在我的数据库数据中打开的端口相匹配。
(活动\打开的 ssh 隧道端口都列在我的数据库中。)
那么,我可以看到端口是否不在 is_open
意味着连接已关闭。