Convert Figma logo to code with AI

imsnif logobandwhich

Terminal bandwidth utilization tool

9,877
291
9,877
26

Top Related Projects

8,221

Ultimate Plumber is a tool for writing Linux pipes with instant live preview

26,263

Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.

19,111

A monitor of resources

2,155

A TUI system monitor written in Rust

10,069

Linux/OSX/FreeBSD resource monitor

10,646

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:

  1. Install Rust if not already installed: https://www.rust-lang.org/tools/install

  2. Install Bandwhich using Cargo:

    cargo install bandwhich
    
  3. Run Bandwhich with sudo/admin privileges:

    sudo bandwhich
    
  4. 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

8,221

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.

26,263

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.

19,111

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.

2,155

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).

10,069

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.

10,646

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 Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

bandwhich

demo

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.

Packaging status

Download a prebuilt binary

We offer several generic binaries in releases for various OSes.

OSArchitectureSupportUsage
Androidaarch64Best effort

All modern Android devices.

Note that this is a pure binary file, not an APK suitable for general usage.

Linuxaarch64Full 64-bit ARMv8+ (servers, some modern routers, RPi-4+).
armv7hfBest effort32-bit ARMv7 (older routers, pre-RPi-4).
x64Full Most Linux desktops & servers.
MacOSaarch64Full Apple silicon Macs (2021+).
x64 Intel Macs (pre-2021).
Windowsx64Full 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:

  1. Check the target architecture. If on Linux, you can use uname -m.
  2. Lookup rustc platform support for the corresponding target triple.
  3. Install cross.
  4. 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 that bandwhich 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:

  1. make sudo preserve your $PATH environment variable;
  2. explicitly set $PATH while running bandwhich: sudo env "PATH=$PATH" bandwhich;
  3. 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

Contributions of any kind are very welcome. If you'd like a new feature (or found a bug), please open an issue or a PR.

To set up your development environment:

  1. Clone the project
  2. cargo run, or if you prefer cargo run -- -i <network interface name> (you can often find out the name with ifconfig or iwconfig). You might need root privileges to run this application, so be sure to use (for example) sudo.

To run tests: cargo test

Note that at the moment the tests do not test the os layer (anything in the os folder).

If you are stuck, unsure about how to approach an issue or would like some guidance, you are welcome to contact: aram@poor.dev

License

MIT