#!/bin/bash # Prints information about a file descriptor socket # Author: Peter Wu # Date: 2013-02-06 rootcmd=sudo sockno=$1 pipeno= sockfd=$(readlink "$1") if [[ $sockfd =~ ^socket:\[[0-9]+\]$ ]]; then sockno=${sockfd#socket:[} sockno=${sockno%]} fi # not a socket but a pipe if [[ $sockfd =~ ^pipe:\[[0-9]+\]$ ]]; then pipeno=${sockfd#pipe:[} pipeno=${pipeno%]} find /proc/[0-9]*/fd -lname "pipe:\\[$pipeno\\]" -ls 2>/dev/null | \ awk -F/ '{ pid=$3; print ""; print; system("ps huwwp " pid); }' exit fi if ! [[ $sockno =~ ^[0-9]+$ ]]; then echo "Numeric socket number required" >&2 exit 1 fi # expects: $prot $sockno # arg1: field index for inode find_by_inode() { &2 return 1 fi done $rootcmd gdb -q "$vmlinux" /proc/kcore \ -ex "p ((struct unix_sock*)0x$addr)->peer" -ex q \ | grep -Po '\(struct sock \*\) 0x\K[0-9a-f]+' } line= for prot in udp tcp; do line=$(find_by_inode 10) [ -z "$line" ] || break done if [ -z "$line" ]; then prot=unix line=$(find_by_inode 7) addr=$(cut -d: -f1 <<<"$line") find_by_inode 7 if [[ $addr =~ ^[0-9a-f]+$ ]]; then addr2=$(find_other_sock $addr) line2=$(grep "^$addr2:" /proc/net/$prot) [ -z "$line2" ] || line="$line"$'\n'"$line2" fi fi if [ -n "$line" ]; then (head -1 /proc/net/$prot; echo "$line") | column -t exit 0 fi echo "No info found for $sockno [$sockfd]"