mcpField
P
portview

portview

本地服务
github.com开发工具612 天前更新

关于 portview

portview 是一个命令行工具,用于查看 Linux、macOS 和 Windows 上的端口及其对应进程,并诊断端口冲突与连接泄漏。它支持 Docker、通过 SSH 检查远程主机,也提供交互式 TUI。它还内置 MCP 服务,供编码 Agent 查询端口和诊断问题。

主要功能

  1. 01列出监听端口及进程名、命令、内存和运行时间
  2. 02doctor 诊断端口冲突、通配符暴露与连接堆积
  3. 03通过 SSH 检查远程主机端口,支持无代理模式
  4. 04Docker 容器端口显示与交互式 TUI 监视
  5. 05JSON 输出与 GitHub Action 集成

适用场景

  1. 01排查开发服务启动时的端口占用冲突
  2. 02在 CI 中检查端口状态并按严重程度失败
  3. 03让编码 Agent 查询端口并比较端口变化

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
cargoportview2.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

portview

CI Crates.io License: MIT

portview 可列出 Linux、macOS 和 Windows 上的端口及其使用进程。 它会显示进程名称、命令、内存用量和运行时间。你可以检查端口、停止其进程,或在交互式终端界面中监控变化。

portview 演示

它还支持 Docker、通过 SSH 连接远程主机,以及供编码 Agent 使用的 MCP 服务。

安装

Homebrew:

brew install mapika/tap/portview

Linux / macOS:

curl -fsSL https://raw.githubusercontent.com/mapika/portview/main/install.sh | sh

Windows(PowerShell):

irm https://raw.githubusercontent.com/mapika/portview/main/install.ps1 | iex

也可以使用 cargo install portview,或从 Releases 下载二进制文件。

功能介绍

portview                          # list all listening ports
portview 3000                     # inspect port 3000 in detail
portview node                     # find ports by process name
portview watch                    # interactive TUI with live refresh
portview watch --docker           # TUI with Docker containers as rows
portview kill 3000 --force        # terminate the process using port 3000
portview doctor                   # diagnose port conflicts and issues
portview ssh user@server          # inspect ports on a remote host
portview ssh user@server watch    # remote TUI over SSH
portview ssh user@server --agentless   # no portview needed on the remote
portview mcp                      # run as an MCP server for AI agents

特性

扫描
$ portview
╭──────┬───────┬─────┬──────────────┬──────┬────────────┬────────┬────────┬────────────────────────────╮
│ PORT │ PROTO │ PID │ ADDR         │ USER │ PROCESS    │ UPTIME │ MEM    │ COMMAND                    │
├──────┼───────┼─────┼──────────────┼──────┼────────────┼────────┼────────┼────────────────────────────┤
│ 3000 │ TCP   │ 8   │ 127.0.0.1    │ root │ node       │     7s │  44 MB │ node /opt/app/web.js       │
│ 5000 │ TCP   │ 11  │ 127.0.0.1    │ root │ python3.12 │     7s │  18 MB │ python3 /opt/app/worker.py │
│ 6380 │ TCP   │ 12  │ 127.0.0.1    │ root │ node       │     7s │ 1.2 GB │ node /opt/app/cache.js     │
│ 7000 │ TCP   │ 10  │ 127.0.0.1    │ root │ node       │     7s │  45 MB │ node /opt/app/ingest.js    │
│ 8080 │ TCP   │ 9   │ 127.0.0.1    │ root │ node       │     7s │  44 MB │ node /opt/app/api.js       │
╰──────┴───────┴─────┴──────────────┴──────┴────────────┴────────┴────────┴────────────────────────────╯

--all 会包含非监听连接,每个连接占一行。 --wide 会显示完整命令。--json 会为脚本生成 JSON 输出。

即使无法确定所有者,端口仍会列出;无法填充的列会显示 -。这可能是因为没有使用 sudo,无法查看其他用户的进程,也可能是因为 TIME_WAIT 等套接字在打开它的进程退出后仍然存在。

下方的扫描、doctor 和 MCP 示例均为真实输出,由 demo/record.sh 在隔离命名空间中捕获,因此用户是 root,路径为 /opt/app。Docker 示例仅供说明,因为它需要正在运行的守护进程。

MCP 服务(供 AI Agent 使用)

portview mcp 通过标准输入输出,使用 Model Context Protocol 提供端口查询、诊断和进程终止功能。 要将其注册到 Claude Code:

claude mcp add portview -- portview mcp

也可以手动配置:

{
  "mcpServers": {
    "portview": {
      "command": "portview",
      "args": ["mcp"]
    }
  }
}
工具功能
list_ports列出监听端口及可用的进程详情
inspect_port检查端口,包括进程工作目录和子进程
find_process按进程名称或命令子字符串查找端口
doctor检查冲突、通配地址暴露、连接堆积和高内存用量
diff_ports报告自基准状态以来新增、关闭或所有者发生变化的端口
kill_port终止使用某端口的进程;dry_run 可预览目标。此工具会向客户端标记为具有破坏性

portview MCP 服务演示

MCP 服务已包含在 portview 二进制文件中。传入 --read-only 可禁用 kill_port 工具:

portview mcp --read-only

已在 MCP Registry 中登记,名称为 mcp-name: io.github.Mapika/portview。

监视模式(交互式 TUI)
portview watch                    # live-refresh every 1s
portview watch --docker           # include Docker containers
portview watch --sort mem         # sort by memory on launch
按键操作
j/k、↑/↓浏览各行
Enter检查端口(完整命令、cwd、子进程、连接)
d/D终止进程或管理 Docker 容器
/筛选所有列
←/→、r切换排序列、反转排序方向
t切换进程树视图
a切换全部/仅监听
q退出

树视图(t):将子进程归组到其父进程下。

详情视图(Enter):显示未换行的完整命令、工作目录、包含端口的子进程列表,以及打开的连接(在 --all 模式下)。

Doctor

portview doctor 会检查端口冲突、通配符绑定、连接堆积和高内存使用情况:

$ portview doctor
  ✓ No port conflicts
  ✓ No wildcard exposure issues
  ! Port 7000 has 16 CLOSE_WAIT connections — possible connection leak
  ! node (PID 12) is listening on port 6380 and using 1.2 GB of memory

  2 warnings found
检查项标记
端口冲突多个 PID 绑定到同一端口
通配符暴露数据库(postgres、redis、mysql、mongod、…)正在 0.0.0.0 上监听
Docker 主机冲突容器发布了主机已占用的端口
连接堆积某个端口上存在大量 TIME_WAIT 或 CLOSE_WAIT 连接;这些情况本身并不能证明存在泄漏
高内存使用监听进程使用的常驻内存超过 1 GB

Docker 会自动检测。使用 portview doctor --json 进行脚本处理(出错时退出代码为 1)。

在 CI 中

GitHub Action 会运行 doctor,并可在出错或出现警告时使工作流失败:

- uses: mapika/portview@v2
  with:
    fail-on: error        # error | warning | never

它会在运行记录中为每项发现添加行内注释、写入摘要表,并将 findings(JSON)、count、errors 和 warnings 作为步骤输出提供:

- uses: mapika/portview@v2
  id: doctor
  with:
    fail-on: never
- run: echo '${{ steps.doctor.outputs.findings }}' | jq .

如果 PATH 中已有 portview,请设置 install: false。适用于 Linux 和 macOS 运行器。

SSH 远程模式

通过 SSH 检查远程主机上的端口:

portview ssh user@server              # one-shot scan
portview ssh user@server watch        # full interactive TUI
portview ssh user@server doctor       # remote diagnostics
portview ssh user@server 3000         # inspect a remote port
portview ssh user@server --ssh-opt "-p 2222"  # custom SSH port

远程 TUI 中的终止操作会通过 SSH 转发。

如果远程主机上没有安装 portview,SSH 模式会使用 ss 和 ps 收集数据;如果没有 ss,则使用 lsof 和 ps。这需要远程主机上有 POSIX shell 和数据收集工具。

$ portview ssh user@server
portview not found on user@server — falling back to agentless mode (ss + ps over SSH).
╭──────┬───────┬─────┬──────────────┬──────┬─────────┬────────┬───────┬──────────────────────╮
│ PORT │ PROTO │ PID │ ADDR         │ USER │ PROCESS │ UPTIME │ MEM   │ COMMAND              │
├──────┼───────┼─────┼──────────────┼──────┼─────────┼────────┼───────┼──────────────────────┤
│ 3000 │ TCP   │ 6   │ 127.0.0.1    │ root │ node    │     3s │ 45 MB │ node /opt/app/web.js │
│ 8080 │ TCP   │ 7   │ 127.0.0.1    │ root │ node    │     3s │ 45 MB │ node /opt/app/api.js │
╰──────┴───────┴─────┴──────────────┴──────┴─────────┴────────┴───────┴──────────────────────╯

即使远程主机上已安装 portview,也可以使用 --agentless 以这种方式收集数据。它支持扫描、端口检查、进程搜索、 诊断和监视模式。

对收集到的数据运行诊断:

portview ssh user@server doctor --agentless

这会使用与本地模式相同的诊断检查。由于无 Agent 模式不会查询远程容器,因此会跳过 Docker 检查。

监视远程端口,并可在 TUI 中终止进程:

portview ssh user@server watch --agentless

监视模式通过单个持久 SSH 连接收集更新。

Docker 集成

使用 --docker 纳入 Docker 容器发布的端口:

$ portview --docker
╭──────┬───────┬───────┬──────────────┬────────┬──────────┬────────┬────────┬────────────────────────────╮
│ PORT │ PROTO │ PID   │ ADDR         │ USER   │ PROCESS  │ UPTIME │ MEM    │ COMMAND                    │
├──────┼───────┼───────┼──────────────┼────────┼──────────┼────────┼────────┼────────────────────────────┤
│ 3000 │ TCP   │ 48291 │ 127.0.0.1    │ mark   │ node     │ 3h 12m │ 248 MB │ next dev [docker:web]      │
│ 8080 │ TCP   │ -     │ 0.0.0.0      │ docker │ pv-nginx │      - │      - │ nginx:alpine :8080->80/tcp │
╰──────┴───────┴───────┴──────────────┴────────┴──────────┴────────┴────────┴────────────────────────────╯

仅容器对应的行没有主机进程,因此 PID、UPTIME 和 MEM 会显示为 -。

在监视模式下,在 Docker 行上按 d 可停止或重启容器,也可查看其日志。

JSON 输出
portview --json                   # pipe to jq, scripts, dashboards
portview --docker --json          # includes Docker ownership data
portview watch --json             # streaming JSON, one array per tick
portview doctor --json            # machine-readable diagnostics
自定义颜色
PORTVIEW_COLORS="port=red,pid=magenta,command=bright_cyan" portview

列:port、proto、pid、user、process、uptime、mem、command。使用 --no-color 可禁用颜色。

工作原理

本地端口和进程数据来自操作系统接口:

字段LinuxmacOSWindows
端口/proc/net/tcp{,6}、udp{,6}proc_pidfdinfoGetExtendedTcp/UdpTable
PID通过 /proc/*/fd/ 由 inode 查找 PIDproc_listpids包含在套接字表中
进程/proc/<pid>/exeproc_pidpathQueryFullProcessImageNameW
内存/proc/<pid>/status VmRSSproc_pidinfoK32GetProcessMemoryInfo
运行时间/proc/<pid>/statproc_pidinfoGetProcessTimes

在 Linux 上,portview 会从 /proc/<pid>/exe 读取可执行文件名。 /proc/<pid>/comm 中的线程名可能会被运行时更改,且长度限制为 15 字节。

Docker 集成使用 docker CLI。SSH 模式使用系统的 ssh 客户端,在远程主机上运行 portview 或无 Agent 数据收集工具。 MCP 模式使用 stdin/stdout 上以换行符分隔的 JSON-RPC 2.0。

从源代码构建

git clone https://github.com/mapika/portview
cd portview
cargo build --release

需要 Rust 1.85+(edition 2024)。Shell 补全和 man 手册页会在构建时生成。

仓库包含一个 Dockerfile。要从容器中检查主机, 请共享主机的网络和 PID 命名空间:

docker run --rm -i --network host --pid host portview

贡献

开发环境设置和指南请参阅 CONTRIBUTING.md,重新生成录制内容请参阅 demo/README.md。

更改应能在所有三个平台上通过类型检查,而不只是你使用的平台:

cargo check --target aarch64-apple-darwin
cargo check --target x86_64-pc-windows-msvc

限制

  • **Linux:**会列出其他用户占用的端口,但要识别进程需要使用 sudo(因为它会读取 /proc/<pid>/fd/)。对于无法归属的行,PID、用户、进程和命令均显示为 -,而不是隐藏这些行。
  • **macOS:**未使用 sudo 时,不会列出其他用户占用的端口——套接字会通过 proc_pidfdinfo 按进程枚举,因此无法打开的进程不会贡献任何可枚举内容。出于同样的原因,doctor 无法检测此处的 TIME_WAIT 堆积;CLOSE_WAIT 则可正常检测。
  • **Windows:**会列出由无法访问的系统进程占用的端口,并显示 PID,但名称和用户显示为 -。终止操作始终会强制结束进程。使用 Administrator 身份运行可查看完整详情。
  • **Docker:**需要 docker CLI 和守护进程访问权限
  • **SSH:**如果远程端缺少 portview,每条命令都会回退到无代理采集:在 Linux 上使用 ss 和 ps,在没有 ss 的系统上使用 lsof。远程端需要安装其中一种工具,并具备 POSIX shell。无代理采集无法检查远程端的 Docker,因此该检查会报告为已跳过,而非通过。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。