Top Related Projects
Ultimate Plumber is a tool for writing Linux pipes with instant live preview
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.
A monitor of resources
A TUI system monitor written in Rust
Linux/OSX/FreeBSD resource monitor
Ping, but with a graph
Quick Overview
Bandwhich is a CLI utility for displaying current network utilization by process, connection, and remote IP/hostname. It provides real-time bandwidth monitoring and network diagnostics in a terminal interface, making it useful for system administrators and network troubleshooters.
Pros
- Provides detailed, real-time network usage information
- Easy-to-use terminal interface with intuitive controls
- Cross-platform support (Linux, macOS, Windows)
- Lightweight and efficient, with minimal system resource usage
Cons
- Requires root/admin privileges to run, which may be a security concern
- Limited historical data retention; focuses on real-time information
- May require additional setup on some systems (e.g., WinPcap on Windows)
- Learning curve for interpreting all available information
Getting Started
To install and run Bandwhich:
-
Install Rust if not already installed: https://www.rust-lang.org/tools/install
-
Install Bandwhich using Cargo:
cargo install bandwhich
-
Run Bandwhich with sudo/admin privileges:
sudo bandwhich
-
Use arrow keys to navigate, 'q' to quit, and 'h' for help within the interface.
Note: On Windows, you may need to install WinPcap or Npcap before running Bandwhich.
Competitor Comparisons
Ultimate Plumber is a tool for writing Linux pipes with instant live preview
Pros of up
- Simpler and more focused on a single task (real-time preview of shell command output)
- Lightweight and easy to install with no dependencies
- Cross-platform support (Linux, macOS, Windows)
Cons of up
- Limited functionality compared to bandwhich's network monitoring capabilities
- Less actively maintained (fewer recent updates and contributions)
- Smaller community and fewer stars on GitHub
Code Comparison
up:
func main() {
flag.Parse()
args := flag.Args()
if len(args) == 0 {
log.Fatal("Error: no command specified")
}
cmd := exec.Command(args[0], args[1:]...)
// ... (additional code)
}
bandwhich:
fn main() -> Result<(), failure::Error> {
let opts = Opt::from_args();
let config = Config::try_from(opts)?;
let (network_frames, network_utilization) = setup_network_interfaces(&config)?;
// ... (additional code)
}
Both projects use command-line arguments, but up focuses on executing and displaying output from a single command, while bandwhich sets up network monitoring infrastructure.
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.
Pros of Glances
- Comprehensive system monitoring with a wide range of metrics (CPU, memory, network, processes, etc.)
- Cross-platform support (Linux, macOS, Windows)
- Web-based interface and REST API for remote monitoring
Cons of Glances
- Higher resource usage due to its comprehensive nature
- Steeper learning curve with more complex configuration options
Code Comparison
Glances (Python):
from glances_api import GlancesApi
glances = GlancesApi(host='localhost', port=61208)
cpu_percent = glances.getCpu()['total']
print(f"CPU usage: {cpu_percent}%")
Bandwhich (Rust):
use bandwhich::network::Bandwidth;
let bandwidth = Bandwidth::new();
let total_bytes = bandwidth.total_bytes();
println!("Total bandwidth: {} bytes", total_bytes);
Key Differences
- Glances offers a more comprehensive system monitoring solution, while Bandwhich focuses specifically on network usage
- Bandwhich provides real-time network traffic visualization, which is not a primary feature of Glances
- Glances is written in Python, making it easier to extend but potentially slower, while Bandwhich is written in Rust for better performance
- Glances has a larger community and more frequent updates, whereas Bandwhich has a smaller but dedicated following
Both tools serve different purposes and can be complementary in a system administrator's toolkit, with Glances offering broader system insights and Bandwhich providing detailed network traffic analysis.
A monitor of resources
Pros of btop
- More comprehensive system monitoring, including CPU, memory, disks, and network
- Highly customizable interface with themes and layout options
- Supports multiple operating systems (Linux, macOS, FreeBSD, OpenBSD)
Cons of btop
- Higher resource usage due to more extensive monitoring capabilities
- Steeper learning curve for customization and advanced features
- Less focused on network traffic analysis compared to bandwhich
Code Comparison
bandwhich (Rust):
pub fn start_ui<B: Backend>(
terminal: &mut Terminal<B>,
app: &mut App,
tick_rate: Duration,
) -> Result<(), Box<dyn Error>> {
// UI rendering logic
}
btop (C++):
void Draw::draw(const bool force) {
if (force or Runner::active) {
if (Global::resized) {
// Redraw logic for resized terminal
}
// Main drawing logic
}
}
Summary
btop offers a more comprehensive system monitoring solution with a customizable interface, while bandwhich focuses specifically on network traffic analysis. btop's broader scope comes at the cost of higher resource usage and complexity, whereas bandwhich provides a simpler, more targeted approach to network monitoring.
A TUI system monitor written in Rust
Pros of ytop
- More comprehensive system monitoring, including CPU, memory, disk, and network
- Customizable interface with different color schemes and layouts
- Supports exporting data to CSV for further analysis
Cons of ytop
- Less focused on network traffic analysis compared to bandwhich
- May consume more system resources due to its broader monitoring scope
- Not as detailed in per-process network usage information
Code Comparison
bandwhich:
let network_utilization = NetworkUtilization::new();
network_utilization.get_process_network_usage();
ytop:
let system = System::new_all();
system.refresh_all();
let cpu_usage = system.global_cpu_info().cpu_usage();
Summary
bandwhich is specifically designed for network traffic analysis, providing detailed per-process network usage information. It's lightweight and focused on network monitoring.
ytop, on the other hand, is a more comprehensive system monitoring tool that covers CPU, memory, disk, and network usage. It offers a customizable interface and data export features but may not provide as detailed network traffic analysis as bandwhich.
The choice between the two depends on whether you need focused network monitoring (bandwhich) or a broader system overview (ytop).
Linux/OSX/FreeBSD resource monitor
Pros of bpytop
- More comprehensive system monitoring, including CPU, memory, disks, and network
- Highly customizable interface with themes and color schemes
- Supports mouse input for easier navigation and interaction
Cons of bpytop
- Higher resource usage due to its graphical interface and broader monitoring scope
- May be overwhelming for users who only need network monitoring
- Written in Python, which can be slower than Rust for certain operations
Code comparison
bandwhich (Rust):
pub fn get_interface_name(&self) -> Option<String> {
self.interface_name.clone()
}
bpytop (Python):
def get_cpu_name() -> str:
try:
with open('/proc/cpuinfo', 'r') as f:
for line in f:
if line.startswith('model name'):
return line.split(':')[1].strip()
except:
pass
return 'Unknown'
Summary
bandwhich focuses specifically on network monitoring and is written in Rust, making it lightweight and fast. It provides detailed information about network usage per process and connection.
bpytop offers a more comprehensive system monitoring solution with a visually appealing interface. It covers CPU, memory, disks, and network, making it suitable for users who want a complete overview of their system's performance. However, this comes at the cost of higher resource usage and potential complexity for users who only need network monitoring.
The choice between the two depends on the user's specific needs and system resources available.
Ping, but with a graph
Pros of gping
- Simpler and more focused functionality, specifically for visualizing ping results
- Provides a colorful, easy-to-read graph of ping times in the terminal
- Supports multiple hosts simultaneously, allowing for comparative network analysis
Cons of gping
- Limited to ping functionality, lacking broader network monitoring capabilities
- Does not provide detailed information about network connections or processes
- Less comprehensive in terms of overall system network usage analysis
Code Comparison
bandwhich:
let network_utilization = NetworkUtilization::new();
network_utilization.get_process_network_usage();
gping:
let ping = Ping::new(&host)?;
let result = ping.send()?;
Summary
bandwhich offers a more comprehensive network monitoring solution, providing detailed information about processes, connections, and overall network usage. It's better suited for in-depth network analysis and troubleshooting.
gping, on the other hand, focuses specifically on visualizing ping results in a user-friendly manner. It's ideal for quick network latency checks and comparing response times between multiple hosts.
The choice between the two depends on the specific use case: bandwhich for detailed network monitoring, or gping for simple, visual ping analysis.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
bandwhich
This is a CLI utility for displaying current network utilization by process, connection and remote IP/hostname
Table of contents
Project status
This project is in passive maintenance. Critical issues will be addressed, but no new features are being worked on. However, this is due to a lack of funding and/or manpower more than anything else, so pull requests are more than welcome. In addition, if you are able and willing to contribute to this project long-term, we would like to invite you to apply for co-maintainership.
For more details, see The Future of Bandwhich #275.
How does it work?
bandwhich
sniffs a given network interface and records IP packet size, cross referencing it with the /proc
filesystem on linux, lsof
on macOS, or using WinApi on windows. It is responsive to the terminal window size, displaying less info if there is no room for it. It will also attempt to resolve ips to their host name in the background using reverse DNS on a best effort basis.
Installation
Downstream packaging status
For detailed instructions for each platform, see INSTALL.md.
Download a prebuilt binary
We offer several generic binaries in releases for various OSes.
OS | Architecture | Support | Usage |
---|---|---|---|
Android | aarch64 | Best effort |
All modern Android devices. Note that this is a pure binary file, not an APK suitable for general usage. |
Linux | aarch64 | Full | 64-bit ARMv8+ (servers, some modern routers, RPi-4+). |
armv7hf | Best effort | 32-bit ARMv7 (older routers, pre-RPi-4). | |
x64 | Full | Most Linux desktops & servers. | |
MacOS | aarch64 | Full | Apple silicon Macs (2021+). |
x64 | Intel Macs (pre-2021). | ||
Windows | x64 | Full | Most Windows desktops & servers. |
Building from source
git clone https://github.com/imsnif/bandwhich.git
cd bandwhich
cargo build --release
For the up-to-date minimum supported Rust version, please refer to the rust-version
field in Cargo.toml.
Cross-compiling
Cross-compiling for alternate targets is supported via cross. Here's the rough procedure:
- Check the target architecture. If on Linux, you can use
uname -m
. - Lookup rustc platform support for the corresponding target triple.
- Install
cross
. - Run
cross build --release --target <TARGET_TRIPLE>
.
Android
Until cross-rs/cross#1222 is solved, use the latest HEAD:
cargo install --git https://github.com/cross-rs/cross.git cross
cross build --release --target aarch64-linux-android
Post install (Linux)
Since bandwhich
sniffs network packets, it requires elevated privileges.
On Linux, there are two main ways to accomplish this:
1. setcap
- Permanently allow the
bandwhich
binary its required privileges (called "capabilities" in Linux). - Do this if you want to give all unprivileged users full access to bandwhich's monitoring capabilities.
- This is the recommended setup for single user machines, or if all users are trusted.
- This is not recommended if you want to ensure users cannot see others' traffic.
# assign capabilities
sudo setcap cap_sys_ptrace,cap_dac_read_search,cap_net_raw,cap_net_admin+ep $(command -v bandwhich)
# run as unprivileged user
bandwhich
Capabilities explained
cap_sys_ptrace,cap_dac_read_search
: allow access to/proc/<pid>/fd/
, so thatbandwhich
can determine which open port belongs to which process.cap_net_raw,cap_net_admin
: allow capturing packets on your system.
2. sudo
(or alternative)
- Require privilege escalation every time.
- Do this if you are an administrator of a multi-user environment.
sudo bandwhich
Note that if your installation method installed bandwhich
to somewhere in
your home directory (you can check with command -v bandwhich
), you may get a
command not found
error. This is because in many distributions, sudo
by
default does not keep your user's $PATH
for safety concerns.
To overcome this, you can do any one of the following:
- make
sudo
preserve your$PATH
environment variable; - explicitly set
$PATH
while runningbandwhich
:sudo env "PATH=$PATH" bandwhich
; - pass the full path to
sudo
:sudo $(command -v bandwhich)
.
Post install (Windows)
You might need to first install npcap for capturing packets on Windows.
Usage
Usage: bandwhich [OPTIONS]
Options:
-i, --interface <INTERFACE> The network interface to listen on, eg. eth0
-r, --raw Machine friendlier output
-n, --no-resolve Do not attempt to resolve IPs to their hostnames
-s, --show-dns Show DNS queries
-d, --dns-server <DNS_SERVER> A dns server ip to use instead of the system default
--log-to <LOG_TO> Enable debug logging to a file
-v, --verbose... Increase logging verbosity
-q, --quiet... Decrease logging verbosity
-p, --processes Show processes table only
-c, --connections Show connections table only
-a, --addresses Show remote addresses table only
-u, --unit-family <UNIT_FAMILY> Choose a specific family of units [default: bin-bytes] [possible values: bin-bytes, bin-bits, si-bytes, si-bits]
-t, --total-utilization Show total (cumulative) usages
-h, --help Print help (see more with '--help')
-V, --version Print version
Contributing
See CONTRIBUTING.md.
License
MIT
Top Related Projects
Ultimate Plumber is a tool for writing Linux pipes with instant live preview
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.
A monitor of resources
A TUI system monitor written in Rust
Linux/OSX/FreeBSD resource monitor
Ping, but with a graph
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot