#!/bin/bash # Script to list all VPN clients and their status # Usage: ./list-clients.sh if [ "$EUID" -ne 0 ]; then echo "ERROR: Please run as root" exit 1 fi WG_INTERFACE="wg0" KEYS_DIR="/etc/wireguard/keys" echo "=========================================" echo "VPN Clients Status" echo "=========================================" echo "" # Check if interface is up if ! ip link show ${WG_INTERFACE} &>/dev/null; then echo "ERROR: ${WG_INTERFACE} interface is not up" exit 1 fi # Get list of client keys CLIENT_KEYS=$(ls ${KEYS_DIR}/client_*.pub 2>/dev/null | sed 's|.*/client_||; s|\.pub$||') if [ -z "${CLIENT_KEYS}" ]; then echo "No clients configured" exit 0 fi # Table header printf "%-15s %-15s %-45s %-20s %s\n" "Client" "IP Address" "Public Key" "Latest Handshake" "Transfer" echo "---------------------------------------------------------------------------------------------------------------------------" for client in ${CLIENT_KEYS}; do CLIENT_PUBKEY=$(cat "${KEYS_DIR}/client_${client}.pub") # Get client info from wg show CLIENT_INFO=$(wg show ${WG_INTERFACE} | grep -A 5 "${CLIENT_PUBKEY}" || echo "") if [ -z "${CLIENT_INFO}" ]; then # Client key exists but not in wg config (disabled) printf "%-15s %-15s %-45s %-20s %s\n" "${client}" "N/A" "${CLIENT_PUBKEY:0:40}..." "DISABLED" "N/A" else # Extract details ALLOWED_IP=$(echo "${CLIENT_INFO}" | grep "allowed ips:" | awk '{print $3}' | cut -d'/' -f1) HANDSHAKE=$(echo "${CLIENT_INFO}" | grep "latest handshake:" | cut -d':' -f2- | xargs) TRANSFER=$(echo "${CLIENT_INFO}" | grep "transfer:" | cut -d':' -f2- | xargs) # Format handshake if [ -z "${HANDSHAKE}" ]; then HANDSHAKE="Never" fi # Format transfer if [ -z "${TRANSFER}" ]; then TRANSFER="N/A" fi printf "%-15s %-15s %-45s %-20s %s\n" "${client}" "${ALLOWED_IP}" "${CLIENT_PUBKEY:0:40}..." "${HANDSHAKE}" "${TRANSFER}" fi done echo "" echo "Total clients: $(echo "${CLIENT_KEYS}" | wc -w)" echo ""