轻量级端口转发工具Porthole:原理、部署与安全实践

news2026/5/2 9:27:05
1. 项目概述一个轻量级、跨平台的本地端口转发与隧道工具如果你经常需要在不同的网络环境之间穿梭比如从家里的电脑访问办公室内网的服务器或者临时把本地的Web服务暴露给外网的同事做个演示那你一定对端口转发和隧道工具不陌生。市面上这类工具很多但要么配置复杂要么依赖特定平台要么功能过于臃肿。今天要聊的这个项目ollfel/porthole就是一位开发者为了解决这些痛点而生的作品。它的名字“porthole”舷窗很形象就是为你打开一个观察和访问内部网络的窗口。简单来说porthole是一个用Go语言编写的命令行工具核心功能是实现安全、简单的TCP/UDP端口转发和隧道建立。它最大的特点是单一二进制文件、零依赖、跨平台。你不需要安装Python、Node.js或者任何运行时环境下载对应系统的可执行文件赋予执行权限就能直接跑起来。这对于系统管理员、开发者和运维人员来说意味着极大的部署便利性尤其是在那些环境受限或需要快速搭建临时通道的场景下。我最初接触它是因为需要一个能在Windows、Linux和macOS上行为完全一致的轻量级转发工具用于一些自动化脚本和应急响应。porthole完美地满足了这个需求。它没有花哨的Web界面所有配置通过命令行参数完成这让它非常适合集成到CI/CD流水线、远程管理脚本中或者直接作为后台服务运行。接下来我会从设计思路、核心使用、高级配置到排错心得完整地拆解这个“小舷窗”里的大学问。2. 核心设计思路与架构解析2.1 为什么选择Go语言与单二进制架构porthole选择用Go语言实现这几乎是这类基础设施工具的“标准答案”。Go的静态编译特性使得最终产物就是一个包含了所有依赖的独立二进制文件真正做到了“一次编译到处运行”。你不需要在目标机器上安装Go环境甚至不需要关心系统的libc版本。这种特性对于运维工具而言是黄金标准极大地降低了分发和使用的复杂度。它的架构是典型的前向代理模式但设计得非常精简。核心就是一个监听器Listener和若干个连接处理器Connection Handler。当你启动porthole时它会在你指定的本地端口上开启监听。一旦有连接进入它会立即与预先配置好的远程目标地址建立连接然后在本地客户端和远程服务之间双向、透明地转发数据。整个过程中porthole自身几乎不解析或修改任何应用层数据除非你启用了特定插件它只负责在传输层打通一条管道。这种“非侵入式”的转发带来了几个好处首先是性能开销极低因为不需要处理高层协议其次是通用性强可以转发任何基于TCP或UDP的协议无论是HTTP、SSH、数据库连接还是自定义的二进制协议最后是稳定性好逻辑简单意味着出错的概率小也更容易维护。2.2 核心工作模式正向转发、反向隧道与多路复用porthole主要支持三种工作模式理解了它们你就能应对绝大多数场景。1. 本地端口转发正向隧道这是最常用的模式。命令格式通常像这样porthole -l 0.0.0.0:8080 -r remote-server:80。它的含义是在本地机器的所有网卡0.0.0.0上监听8080端口将所有到达此端口的连接转发到remote-server这台机器的80端口。使用场景你本地开发了一个Web应用在3000端口但公司防火墙只开放了80和443。你可以用porthole把本地的3000端口映射到服务器的一个空闲端口如8080再通过服务器的80端口反向代理到这个8080端口从而让外网访问。背后的考量这种模式隐藏了真正的后端服务地址客户端只知道porthole所在的地址增加了安全性也方便做负载均衡和迁移。2. 远程端口转发反向隧道这种模式对于从外网访问没有公网IP的内网服务特别有用。命令看起来可能是porthole -r 0.0.0.0:2222 -l 127.0.0.1:22 -s jump-server。它的逻辑是让porthole主动连接到作为中继的jump-server服务器并在jump-server上打开2222端口。当有人连接jump-server:2222时连接会通过这条已建立的隧道被反向转发到内网机器的22端口SSH服务。使用场景你的家用NAS在内网没有公网IP。你有一台具有公网IP的云服务器。你可以在NAS上运行porthole建立一条到云服务器的反向隧道。这样你在公司就能通过连接云服务器的特定端口直接访问到家中的NAS实现远程管理。关键点这种模式解决了内网穿透的问题。中继服务器jump-server成为了一个固定的访问入口。3. 多路复用与连接池对于高并发场景频繁地创建和销毁TCP连接开销很大。porthole内部实现了简单的连接池和多路复用机制。当配置了-m最大连接数参数时它会维护一定数量的到远程目标的持久连接。新的数据流可以复用这些已有连接减少了握手延迟和系统资源消耗。这在转发数据库连接或消息队列流量时效果显著。注意多路复用虽然提升了性能但也引入了状态复杂性。如果远程服务异常断开porthole需要能及时检测并清理池中的失效连接。在实际使用中建议根据业务流量模式合理设置连接池大小避免设置过大导致资源浪费或连接泄漏。3. 从安装到基础使用的完整实操指南3.1 跨平台安装与验证由于是单二进制文件安装porthole异常简单。以Linux/macOS为例最直接的方式是从项目的GitHub Releases页面下载。# 假设最新版本是v1.2.0系统是Linux amd64 wget https://github.com/ollfel/porthole/releases/download/v1.2.0/porthole-linux-amd64 # 下载后重命名为porthole并赋予执行权限 mv porthole-linux-amd64 porthole chmod x porthole # 移动到系统PATH目录方便全局调用 sudo mv porthole /usr/local/bin/ # 验证安装 porthole --version对于Windows用户直接下载porthole-windows-amd64.exe可以重命名为porthole.exe然后将其所在目录添加到系统环境变量PATH中或者直接在命令行里使用绝对路径调用。如果你想体验最新特性或者需要为其他处理器架构如ARM编译也可以从源码编译。前提是本地需要安装Go工具链1.16版本。git clone https://github.com/ollfel/porthole.git cd porthole go build -o porthole ./cmd/porthole # 编译后的porthole文件就在当前目录实操心得版本管理我习惯在/usr/local/bin/下为这类工具建立版本化软链接。例如将下载的二进制文件放在/opt/tools/porthole/v1.2.0/下然后在/usr/local/bin/中创建软链接porthole - /opt/tools/porthole/v1.2.0/porthole。升级时只需下载新版本更改软链接目标即可回滚也特别方便。3.2 基础转发场景实战让我们通过几个具体例子看看porthole如何解决实际问题。场景一本地开发调试远程API你正在开发一个微服务A它需要调用部署在测试服务器192.168.1.100上的另一个微服务B的API端口8080。但你的开发机无法直接访问测试服务器的内网。好在有一台跳板机jump-host 端口22开放可以访问两者。# 在跳板机上执行将跳板机的9000端口转发到测试服务器B的8080端口 ssh -L 9000:192.168.1.100:8080 userjump-host # 现在在你的开发机上访问 localhost:9000 就等于访问 192.168.1.100:8080但SSH隧道可能不稳定或者你需要一个长期运行的后台服务。用porthole可以这样# 在跳板机上运行porthole假设已上传二进制文件 ./porthole -l 0.0.0.0:9000 -r 192.168.1.100:8080 # 同样你的开发机访问 jump-host:9000 即可。 # 为了让服务在后台稳定运行可以结合nohup或systemd nohup ./porthole -l 0.0.0.0:9000 -r 192.168.1.100:8080 /var/log/porthole.log 21 场景二将内网Web服务临时暴露给外网同事你在本地localhost:3000跑着一个前端项目想让异地的同事看看效果。你可以使用porthole配合一个有公网IP的云服务器。# 在你的本地机器上建立一条到云服务器的反向隧道 ./porthole -s your-cloud-server.com -l 127.0.0.1:3000 -r 0.0.0.0:18080 # 这条命令的意思是连接到 your-cloud-server.com并在云服务器上监听18080端口。 # 所有发往云服务器18080端口的流量都会被转发到你本机的3000端口。然后你告诉同事访问http://your-cloud-server.com:18080即可。这里-s参数指定了中继服务器porthole默认会使用一个约定的端口比如2223与中继服务器建立控制连接。你需要确保中继服务器上运行着porthole的服务端模式来接受这种连接。场景三 UDP协议转发很多工具只支持TCP但porthole也支持UDP这对于转发DNS查询、游戏服务器流量等很有用。# 将本地UDP 5353端口DNS备用端口的流量转发到远程DNS服务器 8.8.8.8的53端口 ./porthole -l udp://0.0.0.0:5353 -r udp://8.8.8.8:53使用时需要显式指定协议udp://。UDP转发是无状态的porthole会为每个收到的UDP数据包独立地转发到远程目标并等待回复。4. 高级配置、性能调优与安全考量4.1 配置文件与命令行参数详解虽然命令行参数已经足够清晰但对于复杂的、需要长期运行的转发规则使用配置文件更便于管理。porthole支持YAML格式的配置文件。# config.yaml tunnels: - name: web-to-test local: 0.0.0.0:8080 remote: 192.168.1.100:80 protocol: tcp max_connections: 100 idle_timeout: 5m # 连接空闲超时时间 - name: ssh-reverse-tunnel server: relay.example.com:2223 # 中继服务器地址 local: 127.0.0.1:22 remote: 0.0.0.0:2222 # 可以配置认证信息如果服务端需要 # auth_token: your-secret-token然后通过-c参数指定配置文件启动porthole -c config.yaml。配置文件允许你定义多个隧道并设置更丰富的参数如连接超时timeout、读写缓冲区大小buffer_size、日志级别log_level等。关键命令行参数解析-l, --local本地监听地址。格式为[协议://]地址:端口如tcp://0.0.0.0:80或udp://127.0.0.1:53。协议默认为tcp。-r, --remote远程目标地址。格式同上。-s, --server在中继模式下指定中继服务器的地址。这是建立反向隧道的核心参数。-m, --max-conns最大并发连接数。防止单个隧道耗尽系统资源。-t, --timeout连接和读写的超时时间。例如30s、2m。对于不稳定的网络适当调大有帮助。-v, --verbose输出更详细的日志用于调试。-d, --daemon以守护进程模式运行部分版本支持或需自行搭配systemd。4.2 性能调优要点porthole本身很轻量但在大流量下合理的调优能提升稳定性和吞吐量。缓冲区大小通过--buffer-size或在配置文件中设置buffer_size可以调整每次读写的数据块大小。默认值通常是4KB或8KB对于大多数场景是合适的。如果转发的是大量小数据包如高频的API请求可以适当调小以减少延迟如果转发的是大文件或流媒体调大如32KB、64KB可以减少系统调用次数提升吞吐。调整后务必进行压测观察内存和CPU使用率的变化。连接池与超时对于需要保持长连接的服务如数据库启用连接池--max-conns并设置合理的--idle-timeout非常重要。连接池避免了频繁的三次握手但空闲连接占用资源。idle-timeout能自动清理长时间不活动的连接。例如设置--max-conns 50 --idle-timeout 10m表示最多保持50个连接空闲超过10分钟则关闭。系统资源限制在Linux上porthole作为网络服务会受到系统对文件描述符File Descriptor数量的限制。如果出现“too many open files”错误需要提高系统的限制。# 临时提高当前会话限制 ulimit -n 65535 # 永久修改编辑 /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535同时确保运行porthole的用户有足够的权限绑定到特权端口1-1024。通常的作法是用非root用户启动但监听高端口如8080或者使用authbind、setcap等工具赋予特定二进制文件绑定特权端口的能力sudo setcap cap_net_bind_serviceep /usr/local/bin/porthole。4.3 安全加固实践端口转发工具在打通网络便利的同时也带来了安全风险。如果配置不当可能成为攻击者进入内网的跳板。最小化监听范围除非必要本地监听地址-l不要使用0.0.0.0。如果只允许本机访问务必使用127.0.0.1。例如-l 127.0.0.1:3306只允许本机连接3306端口进行转发外部无法直接访问这个转发端口。使用访问控制porthole本身功能纯粹不内置复杂的ACL。安全访问控制应依赖操作系统防火墙如iptables, firewalld或网络层面的安全组。例如在云服务器上通过安全组规则严格限制只有特定的IP地址可以访问porthole监听的端口。# 例如在Linux上使用iptables只允许IP 203.0.113.10 访问本机的9000端口 iptables -A INPUT -p tcp --dport 9000 -s 203.0.113.10 -j ACCEPT iptables -A INPUT -p tcp --dport 9000 -j DROP中继模式下的认证在反向隧道中继模式下确保中继服务器端的porthole服务如果以服务端模式运行配置了认证机制。查看项目文档看是否支持Token认证或TLS客户端证书认证。务必不要将中继服务暴露在公网而不加任何认证。日志与审计启用-vverbose日志并将日志输出到文件或集中式日志系统如ELK。定期检查日志关注异常连接如来自未知IP的大量连接尝试。这能帮助你在发生安全事件时进行追溯和分析。网络隔离尽量不要用porthole直接转发核心生产环境或存有敏感数据的服务。如果必须转发应将其部署在一个独立的“堡垒”网络区域该区域与核心生产网络之间有严格的防火墙策略。重要安全提醒永远不要使用弱密码或默认配置运行任何网络服务包括porthole。对于需要暴露在公网的服务强烈建议在前面增加一层反向代理如Nginx并配置HTTPS、WAFWeb应用防火墙等安全措施。porthole更适合在内网或受信任的网络环境中作为便捷的连通工具。5. 集成到系统服务与自动化运维5.1 使用Systemd管理Porthole服务为了让porthole在Linux服务器上稳定运行并具备开机自启、故障重启、日志管理等功能最好的方式是将其配置为systemd服务。创建服务文件/etc/systemd/system/porthole.service[Unit] DescriptionPorthole Tunnel Service Afternetwork.target Wantsnetwork.target [Service] Typesimple # 指定运行用户避免使用root Userporthole Groupporthole # 工作目录可存放配置文件 WorkingDirectory/etc/porthole # 启动命令使用配置文件 ExecStart/usr/local/bin/porthole -c /etc/porthole/config.yaml # 重启策略 Restarton-failure RestartSec10 # 资源限制可选 LimitNOFILE65535 # 安全相关限制服务能力 CapabilityBoundingSet PrivateTmptrue NoNewPrivilegestrue [Install] WantedBymulti-user.target然后创建对应的用户和目录并设置权限sudo useradd -r -s /bin/false porthole sudo mkdir /etc/porthole sudo chown porthole:porthole /etc/porthole # 将你的config.yaml放到/etc/porthole/下 sudo cp config.yaml /etc/porthole/ sudo chown porthole:porthole /etc/porthole/config.yaml最后启用并启动服务sudo systemctl daemon-reload sudo systemctl enable porthole.service sudo systemctl start porthole.service sudo systemctl status porthole.service # 检查状态实操心得日志管理Systemd会自动捕获服务的标准输出和错误你可以使用journalctl -u porthole.service -f来实时查看日志。如果需要更结构化的日志可以在ExecStart命令中通过--log-file参数如果支持指定文件路径或者使用logger命令将输出发送到syslog。5.2 与Docker和Kubernetes集成在容器化环境中porthole可以作为Sidecar容器为主应用提供网络连通能力。Docker Compose示例version: 3.8 services: myapp: image: my-application:latest networks: - app-network # 假设应用监听3000端口 porthole-sidecar: image: your-registry/porthole:latest # 需要将porthole打包为Docker镜像 command: [-l, 0.0.0.0:8080, -r, myapp:3000] # 将sidecar的8080转发到myapp的3000 networks: - app-network ports: - 18080:8080 # 将宿主机的18080映射到sidecar的8080 depends_on: - myapp networks: app-network: driver: bridge这样外部通过宿主机的18080端口访问流量会经过porthole-sidecar容器转发给myapp容器。这种方式隔离了转发逻辑和应用逻辑。Kubernetes Sidecar模式在Pod定义中添加一个porthole容器。apiVersion: v1 kind: Pod metadata: name: myapp-with-porthole spec: containers: - name: main-app image: my-application:latest ports: - containerPort: 3000 - name: tunnel-sidecar image: your-registry/porthole:latest command: [/porthole, -l, 0.0.0.0:8080, -r, 127.0.0.1:3000] ports: - containerPort: 8080然后通过Service暴露这个Pod的8080端口。这种方式常用于调试或为Pod提供特定的网络出口。5.3 在CI/CD流水线中的妙用在自动化部署和测试中porthole可以临时打通网络方便进行集成测试。例如你的CI流水线需要在测试服务器上部署一个服务并让运行在CI Runner可能在另一个网络上的自动化测试脚本能够访问它。你可以在部署脚本中启动一个porthole反向隧道# 在测试服务器上执行的部署后脚本片段 #!/bin/bash # ... 部署应用 ... # 启动porthole将本地的应用端口通过中继服务器暴露给CI Runner可访问的地址 ./porthole -s ci-relay.company.com -l 127.0.0.1:${APP_PORT} -r 0.0.0.0:${EXPOSED_PORT} TUNNEL_PID$! # 记录PID以便测试结束后清理 echo $TUNNEL_PID /tmp/porthole_tunnel.pid # 通知CI Runner服务已在 ci-relay.company.com:${EXPOSED_PORT} 就绪 # ... 后续测试 ...测试结束后CI Runner可以通过SSH或其他方式通知测试服务器清理隧道进程kill $(cat /tmp/porthole_tunnel.pid)。这样就实现了动态、按需的网络打通避免了在测试服务器上长期开放端口。6. 常见问题排查与性能监控实战6.1 连接失败问题诊断流程即使配置正确网络问题也千奇百怪。下面是一个系统的排查流程。检查porthole进程是否运行ps aux | grep porthole。查看进程是否存在命令行参数是否正确。检查端口监听状态# Linux/macOS netstat -tlnp | grep porthole # 或使用更现代的ss命令 ss -tlnp | grep porthole # Windows netstat -ano | findstr :8080确认porthole是否成功绑定了你配置的本地端口。如果没看到可能是端口被占用或者porthole没有权限绑定如绑定1024以下端口需要root权限。检查本地防火墙本地系统的防火墙可能阻止了连接。# 临时关闭防火墙测试用生产环境谨慎 sudo ufw disable # Ubuntu sudo systemctl stop firewalld # CentOS/RHEL # 或者添加放行规则 sudo ufw allow 8080/tcp检查远程目标可达性从运行porthole的机器上测试是否能连接到远程目标。telnet remote-server 80 # 或 nc -zv remote-server 80如果连不上问题可能出在网络路由、远程主机防火墙或远程服务本身。启用详细日志使用-v或--verbose参数重启porthole观察连接建立过程中的日志输出。日志通常会显示“listening on...”、“connected to...”、“error:...”等关键信息。网络抓包分析如果以上步骤都无法定位终极手段是抓包。在porthole所在机器上使用tcpdump或Wireshark。sudo tcpdump -i any port 8080 -nn -v观察是否有SYN包到达客户端连接porthole是否向远程目标发送了SYN包是否收到了回复。这能清晰判断问题发生在哪一跳。6.2 性能瓶颈分析与优化当转发流量大时可能会遇到性能问题。可以从以下几个维度分析CPU占用高使用top或htop查看porthole进程的CPU使用率。如果持续很高可能是转发流量非常大或者--buffer-size设置过小导致频繁的系统调用。尝试适当增大缓冲区。如果单个进程占满单核可以考虑对多个端口或服务分别启动多个porthole进程来利用多核Go的单个程序模型对多核利用有其特点但多进程是简单的横向扩展方式。内存占用高检查内存使用。porthole本身内存占用很小但如果设置了非常大的--max-conns且连接数很多每个连接都会占用一定的缓冲区内存。根据实际并发连接数调整该参数。网络吞吐量低检查带宽在两端使用iperf3测试原始网络带宽排除网络基础设施的限制。检查延迟高延迟网络下TCP窗口大小可能成为瓶颈。虽然porthole不直接控制但确保系统TCP参数优化过如net.core.rmem_max,net.core.wmem_max。porthole本身限制porthole是单goroutine per connection或类似模型还是使用了更复杂的IO多路复用对于海量连接如万级别简单的每连接一协程模型可能会遇到调度开销。可以查看项目文档或源码了解其并发模型。对于极端性能场景可能需要考虑更专业的负载均衡器如HAProxy或Nginx Stream模块。连接不稳定频繁断开超时设置检查--timeout和--idle-timeout设置是否过短。对于长连接服务如数据库需要增加超时时间或设置为0禁用。中间设备网络中的防火墙、NAT设备可能有自己的连接超时设置会主动断开空闲连接。可以尝试在应用层或通过porthole定期发送心跳包来保持连接活跃。系统资源检查是否触发了系统的文件描述符限制或内存限制。6.3 监控与告警搭建对于生产环境使用的porthole隧道需要建立基本的监控。基础健康检查定期检查porthole进程是否存在。可以通过systemd的systemctl is-active porthole或者简单的pgrep porthole来实现。将检查脚本加入cron或监控系统如Prometheus的Blackbox Exporter。端口连通性监控使用nc或telnet定期尝试连接porthole监听的本地端口以及通过隧道应能访问的最终服务端口。例如# 监控脚本片段 if ! nc -z localhost 8080 2/dev/null; then echo CRITICAL: Porthole local port 8080 is not accessible # 发送告警... fi资源监控通过ps,top或/proc文件系统监控porthole进程的CPU、内存占用以及通过ss -s查看其建立的连接数。可以将这些指标收集到Prometheus中需要编写简单的exporter或使用node_exporter的textfile收集器。日志监控将porthole的日志特别是错误日志stderr接入ELK或Loki等日志系统。设置告警规则当日志中出现大量“connection refused”、“timeout”、“reset by peer”等错误时触发告警。一个简单的监控脚本示例#!/bin/bash SERVICEporthole PORT8080 REMOTE_HOSTtarget-internal-server REMOTE_PORT80 LOG_FILE/var/log/porthole_monitor.log # 检查进程 if ! pgrep -x $SERVICE /dev/null; then echo $(date): ERROR - $SERVICE process not found. Attempting restart... $LOG_FILE systemctl restart $SERVICE 2 $LOG_FILE fi # 检查本地端口 if ! nc -z localhost $PORT 2/dev/null; then echo $(date): ERROR - Local port $PORT not responding. $LOG_FILE fi # 检查隧道连通性通过本地端口访问远程服务 # 这里发送一个简单的HTTP HEAD请求到转发的服务假设是HTTP if ! curl -s -I --max-time 5 http://localhost:$PORT /dev/null 21; then echo $(date): WARNING - Tunnel to $REMOTE_HOST:$REMOTE_PORT via port $PORT may be down. $LOG_FILE fi将这个脚本加入crontab每分钟执行一次就能实现最基本的存活性和连通性监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2574534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…