轻量级 Linux 终端网络流量监控工具
Project description
netop
netop is a focused rewrite of the original tmd-top idea for day-to-day
Linux network troubleshooting. The upstream project has not seen active feature
work for a while, and its original design bundled GeoIP lookup, SQLite snapshot
tables, firewall mutation, and TUI rendering into one application. This fork
intentionally narrows the scope to one job: fast, read-only terminal network
monitoring.
Design Goals
- Pure monitoring: no IP ban button, no iptables, nftables, or firewalld writes.
- Stateless runtime: no SQLite database and no persistent traffic history.
- No GeoIP: no bundled MMDB file, no location column, no per-IP lookup cost.
- Low overhead: collect from
ss,ps, and/proc/net/dev, then calculate rates from in-memory deltas. - Modern Textual path: use public Textual APIs and track
textual>=8.2,<9instead of pinning totextual==1.0.0.
Current Status
This is an early refactor branch. The package and CLI entry point have been
renamed to netop. Compatibility with the old tmd and tmd-top command
names is intentionally not preserved.
The UI currently shows:
- interface traffic
- listening services
- outbound processes
- per-service or per-process TCP connection details
- search, refresh mode, sort mode, permission state, and rate unit state
Requirements
- Python >= 3.10
- Linux
iproute2forssprocpsforps
Install From Source
python -m pip install -e .
Usage
netop
Run with elevated privileges when possible if you need complete PID/process ownership data:
sudo netop
When started as a normal user, netop will try sudo -n ss if passwordless
sudo is available. It never prompts for a sudo password inside the TUI.
Shortcuts
| Key | Action |
|---|---|
q |
Quit |
v |
Focus search |
b |
Toggle bit/byte rate mode |
t |
Slow refresh to 5 seconds |
y |
Restore refresh to 1 second |
r |
Sort by total traffic |
c |
Sort by connections |
i |
Sort by unique IP count |
u |
Sort by upload |
d |
Sort by download |
z |
Sort by CPU |
x |
Sort by memory |
Click or highlight a listening service or outbound process row to display its connection details on the right.
Display Units
By default, netop displays network rates as bit rates such as Kb/s and
Mb/s. Press b to switch to byte-rate mode such as KB/s and MB/s.
Data Flow
ss -tniH state establishedreads TCP socket counters.ss -tpanHreads listening sockets, established sockets, PIDs, and process names when available.psprovides lightweight CPU and memory metadata by PID./proc/net/devprovides interface-level counters.- The collector computes deltas in memory and sends immutable snapshots to the Textual UI.
What Changed From tmd-top
| Area | netop direction |
|---|---|
| GeoIP | Removed |
| SQLite | Removed |
| Firewall ban actions | Removed |
| Package name | netop |
| CLI command | netop only |
| Textual dependency | textual>=8.2,<9 |
| Runtime model | Read-only, in-memory snapshots |
Original Project
Original repository README: https://github.com/CDWEN0526/tmd-top
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netop-0.1.0.tar.gz.
File metadata
- Download URL: netop-0.1.0.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4f3371491da8cb48c92e522098f8234a0064cf94a830dda1e2c2184c3d0c743
|
|
| MD5 |
b8576f939ea89a01e38811934b616f41
|
|
| BLAKE2b-256 |
81daeffb78d3620c5114530fbac9be6c9f0a95642b444559e769ffc02cb2a2ca
|
Provenance
The following attestation bundles were made for netop-0.1.0.tar.gz:
Publisher:
pypi.yml on i-square/netop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netop-0.1.0.tar.gz -
Subject digest:
b4f3371491da8cb48c92e522098f8234a0064cf94a830dda1e2c2184c3d0c743 - Sigstore transparency entry: 2063191969
- Sigstore integration time:
-
Permalink:
i-square/netop@b5f38d0a3956bfb3de44ef5dd4241660c4b0a54c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/i-square
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@b5f38d0a3956bfb3de44ef5dd4241660c4b0a54c -
Trigger Event:
push
-
Statement type:
File details
Details for the file netop-0.1.0-py3-none-any.whl.
File metadata
- Download URL: netop-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dabc0e29cf88ffe27d1d9ae50c603741c50ec8b145205ce2d147b00dcdca84fd
|
|
| MD5 |
67f0bbb196a4451d838eeaccc7448eea
|
|
| BLAKE2b-256 |
2c9715faffbd59995bdb927a896e64684c567f16d59f72a9d9a44bf20379e908
|
Provenance
The following attestation bundles were made for netop-0.1.0-py3-none-any.whl:
Publisher:
pypi.yml on i-square/netop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netop-0.1.0-py3-none-any.whl -
Subject digest:
dabc0e29cf88ffe27d1d9ae50c603741c50ec8b145205ce2d147b00dcdca84fd - Sigstore transparency entry: 2063192049
- Sigstore integration time:
-
Permalink:
i-square/netop@b5f38d0a3956bfb3de44ef5dd4241660c4b0a54c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/i-square
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@b5f38d0a3956bfb3de44ef5dd4241660c4b0a54c -
Trigger Event:
push
-
Statement type: