#!/bin/bash # # 2003-10-18 salsi@icosaedro.it # # 2005-11-21 # - removed option -w prompt="==> " prog_name=$( basename "$0" ) prefs="$HOME/.$prog_name.prefs" # imposta default: interface=lo show_net_name=no show_host_name=no show_port_name=no more_protocol_info=no snaplens=68 print_time=no verbosity=0 show_hex=no show_ascii_too=no show_ascii_too=no parse_packets=no save_on_exit=yes function add_slashes() { echo "$1" | sed 's/\(["$\\]\)/\\\1/g' } function show_yesno() { if [ ${!2} = yes ]; then echo -n "[x]" else echo -n "[ ]" fi echo " $1" } function toggle_yesno() { if [ ${!1} = yes ]; then eval $1=no else eval $1=yes fi } function get_string() { local new IFS_ori echo -n "[${!1}] $prompt" IFS_ori="$IFS" read -r new IFS="$IFS_ori" if [ -z "$new" ]; then return fi new=$( add_slashes "$new" ) eval "$1=\"$new\"" } function build_cmd() { local cmd cmd="tcpdump -i $interface -s $snaplens -l" if [ $parse_packets = "yes" ]; then if [ $show_host_name = yes ]; then #if [ $show_port_name = yes ]; then #else #fi [ $show_net_name = yes ] && cmd="$cmd -a" else cmd="$cmd -nn" fi [ $more_protocol_info = no ] && cmd="$cmd -q" [ $print_time = no ] && cmd="$cmd -t" case $verbosity in 1) cmd="$cmd -v" ;; 2) cmd="$cmd -vv" ;; 3) cmd="$cmd -vvv" ;; esac if [ $show_hex = yes ]; then cmd="$cmd -x" [ $show_ascii_too = yes ] && cmd="$cmd -X" fi fi echo "$cmd" } function load_prefs() { if [ -f "$prefs" ]; then echo "Reading preferences from $prefs..." source "$prefs" fi } function out() { while [ $# -gt 0 ]; do value=$( add_slashes "${!1}" ) echo "$1=\"$value\"" shift done } function save_prefs() { out interface show_net_name show_host_name show_port_name \ more_protocol_info snaplens print_time verbosity show_hex \ show_ascii_too save_on_exit \ > $prefs } function execute() { local cmd cmd=$( build_cmd ) eval "$cmd" } function Usage() { echo "$prog_name - menu interface to tcpdump" echo "Usage: $prog_name [-h] [--help] [interface]" exit } load_prefs if [ "$1" = "-h" -o "$1" = "--help" ]; then Usage fi [ $# -gt 0 ] && interface="$@" while :; do echo echo "$prog_name - menu interface to tcpdump" echo "i Interface: $interface" echo "l No. of bytes to snarf ([68,65535]): $snaplens" echo "p $(show_yesno "Parse packets" parse_packets)" if [ $parse_packets = yes ]; then echo "t $(show_yesno "Print a timestamp in each dump line" print_time)" echo "m $(show_yesno "Print more protocol information on output" more_protocol_info)" echo "h $(show_yesno "Convert host addresses to names" show_host_name)" if [ $show_host_name = yes ]; then echo "n $(show_yesno "Attempt to convert network and broadcast addresses to names" show_net_name)" echo "c $(show_yesno "Convert protocol and port numbers to names" show_port_name)" fi echo "v Verbosity level ([0,3]): $verbosity" echo "H $(show_yesno "Print each packet (minus its link level header) in hex" show_hex)" if [ $show_hex = yes ]; then echo "a $(show_yesno "Print ascii too" show_ascii_too)" fi fi echo "S $(show_yesno "Save settings on exit to the file $prefs" save_on_exit)" echo "s Show resulting command" echo "x Execute" echo "q Quit" echo -n "$prompt" read -n 1 opt echo case "$opt" in i) get_string interface ;; p) toggle_yesno parse_packets ;; n) toggle_yesno show_net_name ;; h) toggle_yesno show_host_name ;; c) toggle_yesno show_port_name ;; m) toggle_yesno more_protocol_info ;; l) get_string snaplens ;; t) toggle_yesno print_time ;; v) get_string verbosity if [ "$verbosity" -lt 0 ]; then verbosity=0 fi if [ "$verbosity" -gt 3 ]; then verbosity=3 fi ;; H) toggle_yesno show_hex ;; a) toggle_yesno show_ascii_too ;; S) toggle_yesno save_on_exit ;; s) echo -e "Resulting command:\n$(build_cmd)" ;; x) execute ;; q) [ $save_on_exit = yes ] && save_prefs; exit ;; esac done