feat: Add ARP interface finder script and README (#33)

*  feat: Add ARP interface finder script and README

This commit adds a new script, `run.sh`, that finds all usable network
interfaces for `arp-scan` and exports them to a configuration file. The
script detects interfaces that are "UP" (usable for scanning), skips
virtual container interfaces (veth), and handles special cases like
`eth0@if46` that might be in different network namespaces.

Additionally, a README file is added to provide instructions on how to
run the command.

*  feat(arp-iface-finder): Use bash shebang for portability

Modify the shebang line in the `run.sh` script to use `#!/usr/bin/env bash`
instead of `#!/bin/bash`. This ensures the script will run on systems
where the bash binary is not located at `/bin/bash`, improving
portability.
This commit is contained in:
Christopher
2025-02-20 15:18:52 -06:00
committed by GitHub
parent f143e13de6
commit e244fd35fc
2 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
# Run command
```bash
bash -c "$(wget -qLO - https://raw.githubusercontent.com/bigbeartechworld/big-bear-scripts/master/arp-iface-finder/run.sh)"
```
# Description
This script will find all usable network interfaces for arp-scan.

100
arp-iface-finder/run.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/usr/bin/env bash
# Colors for better output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# This script finds active network interfaces for arp-scan and exports them to a config file.
# It detects interfaces that are "UP" (usable for scanning), skips virtual container interfaces (veth),
# and handles special cases like eth0@if46 that might be in different network namespaces.
# Function to get and filter usable network interfaces with their states
get_usable_interfaces() {
# Capture the output of 'ip link show' once to list all network interfaces
# We use this single call to avoid issues with repeated calls failing for namespaced interfaces
ip link show |
# Filter for lines starting with a number (interface entries), exclude loopback (lo)
grep -E '^[0-9]+:' | grep -v 'lo:' |
# Process each line of output
while read -r line; do
# Extract the interface name (e.g., eth0@if46) from the line, removing whitespace
iface=$(echo "$line" | awk -F: '{print $2}' | tr -d ' ')
# Skip virtual Ethernet (veth) interfaces used by containers, as theyre not useful for general scanning
if [[ "$iface" =~ ^veth ]]; then
continue
fi
# Check if the interface has "UP" in its flags, meaning its active and usable
if echo "$line" | grep -q "<.*,UP"; then
# Extract the state (e.g., UP, DOWN) from the line
state=$(echo "$line" | grep -o "state [A-Z]*" | awk '{print $2}')
# Output the interface name and state, separated by | for later parsing
echo "$iface|$state"
fi
done |
# Remove duplicates and sort the list
sort -u
}
# Display Welcome
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}BigBear ARP Interface Finder V0.1${NC}"
echo -e "${BLUE}========================================${NC}"
echo "Here are some links:"
echo "https://community.bigbeartechworld.com"
echo "https://github.com/BigBearTechWorld"
echo ""
echo "If you would like to support me, please consider buying me a tea:"
echo "https://ko-fi.com/bigbeartechworld"
echo ""
# Get the list of usable interfaces and store it in an array
# The < <() syntax feeds the function output into mapfile
mapfile -t interface_lines < <(get_usable_interfaces)
# If no usable interfaces are found, exit with an error
if [ ${#interface_lines[@]} -eq 0 ]; then
echo "No usable interfaces found!"
exit 1
fi
# Initialize an array to store the final list of interface names
usable_interfaces=()
# Loop through each interface line to extract details and display them
for line in "${interface_lines[@]}"; do
# Split the line into interface name and state using | as the delimiter
iface=$(echo "$line" | cut -d'|' -f1)
state=$(echo "$line" | cut -d'|' -f2)
# Try to get the IP address for the interface; suppress errors if it fails (e.g., namespace issues)
ip_addr=$(ip addr show "$iface" 2>/dev/null | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
# If no IP is found (e.g., due to namespace mismatch), set a default message
[ -z "$ip_addr" ] && ip_addr="No IP"
# Display the interface details for the user
echo "Found usable interface: $iface (IP: $ip_addr, State: $state)"
# Add the interface name to the array
usable_interfaces+=("$iface")
done
# Combine all usable interface names into a single space-separated string
IFACES="${usable_interfaces[*]}"
echo -e "\nUsable interfaces detected: $IFACES"
# Prepare the export command for the config file
echo -e "\nGenerated configuration:"
echo "export IFACES=\"$IFACES\""
# Write the export command to a file that can be sourced later
# This creates arp_scan_config.sh with the IFACES variable set
echo "export IFACES=\"$IFACES\"" > arp_scan_config.sh
# Tell the user how to use the generated config file
echo -e "\nConfiguration saved to arp_scan_config.sh"
echo "Source the file with: source ./arp_scan_config.sh"