Skip to content

Instantly share code, notes, and snippets.

@fl64
Last active December 18, 2017 18:41
Show Gist options
  • Save fl64/d55be28b018793a13c7879201a24be0f to your computer and use it in GitHub Desktop.
Save fl64/d55be28b018793a13c7879201a24be0f to your computer and use it in GitHub Desktop.
OTUS Linux HW6 lsof.sh v2 (works on CentOS 7.4)
#!/bin/bash
getstate()
{
case $1 in
'01') st='ESTABLISHED';;
'02') st='SYN_SENT';;
'03') st='SYN_RECV';;
'04') st='FIN_WAIT1';;
'05') st='FIN_WAIT2';;
'06') st='TIME_WAIT';;
'07') st='CLOSE';;
'08') st='CLOSE_WAIT';;
'09') st='LAST_ACK';;
'0A') st='LISTEN';;
'0B') st='CLOSING';;
*) st='UNKNOWN';;
esac
echo $st
}
ipv4()
{
echo "$((16#${1:6:2})).$((16#${1:4:2})).$((16#${1:2:2})).$((16#${1:0:2}))"
}
ipv6()
{
#0000 0000 0000 0000 0000
echo "${1:12:4}:${1:8:4}:${1:4:4}:${1:0:4}"
}
portv4()
{
echo "$((16#$1))"
}
ipv4tcp(){
echo "TCP: "$(ipv4 $2)":"$(portv4 $( echo $2 | cut -d ":" -f 2))" -> "$(ipv4 $3)":"$(portv4 $( echo $3 | cut -d ":" -f 2)) "[$(getstate $4)]"
}
ipv4udp(){
echo "UDP: "$(ipv4 $2)":"$(portv4 $( echo $2 | cut -d ":" -f 2))
}
ipv6tcp(){
echo "TCP6: "$(ipv6 $2)":"$(portv4 $( echo $2 | cut -d ":" -f 2))" -> "$(ipv6 $3)":"$(portv4 $( echo $3 | cut -d ":" -f 2)) "[$(getstate $4)]"
}
ipv6udp(){
echo "UDP6: "$(ipv6 $6)":"$(portv4 $( echo $2 | cut -d ":" -f 2))
}
procfiles(){
p_pid=$1
exec 2>/dev/null
procpath="/proc/"$p_pid
if ! [ ! -d procpath ]; then continue; fi
p_comm=$(cat $procpath"/comm" | cut -c -9)
#p_cwd=$(cat $1"/cwd")
for f in $( ls $procpath"/fd" | grep -E '^[0-9]+$' | sort -n); do
#echo $(stat -L $procpath"/fd/"$f --format "%i %d (%F) (%U) %t %T %s")
regex='([0-9]*) ([a-dA-F0-9]*) \((.*)\) \((.*)\).* ([a-dA-F0-9]*) ([a-dA-F0-9]*) ([0-9]*)'
if [[ $(stat -L $procpath"/fd/"$f --format "%i %d (%F) (%U) %t %T %s") =~ $regex ]]; then
# echo "$(stat -L $procpath"/fd/"$f --format "%i %d (%F) (%U) %t %T %s") "
p_size=${BASH_REMATCH[7]}
p_user=$(stat $procpath"/fd/"$f --format "%U")
p_device=${BASH_REMATCH[2]}
p_inode=${BASH_REMATCH[1]}
# echo "0x"${BASH_REMATCH[5]} "0x"${BASH_REMATCH[6]}
if [ ${BASH_REMATCH[5]} -gt 0 ] || [ ${BASH_REMATCH[6]} -gt 0 ]; then
major="0x"${BASH_REMATCH[5]}
minor="0x"${BASH_REMATCH[6]}
else
major="0x"$((${BASH_REMATCH[2]} >> 8))
minor="0x"$((${BASH_REMATCH[2]} & 0xFF))
fi
p_path=$( readlink -n $procpath"/fd/"$f)
case ${BASH_REMATCH[3]} in
"regular file")
p_type="REG"
;;
"regular empty file")
p_type="REG"
;;
"character special file")
p_type="CHR"
;;
"directory")
p_type="DIR"
;;
"fifo")
p_type="FIFO"
p_path=$( readlink -n $procpath"/fd/"$f)
;;
"socket")
p_type=$(grep -e " "$p_inode" " /proc/net/* 2>/dev/null | cut -d ":" -f 1 | cut -d "/" -f 4)
if [ ! -z $p_type ]; then
case $p_type in
"tcp")
p_type="IPv4"
p_path=$(ipv4tcp $(grep -h -e " "$p_inode" " /proc/net/* 2>/dev/null))
;;
"udp")
p_type="IPv4"
p_path=$(ipv4udp $(grep -h -e " "$p_inode" " /proc/net/* 2>/dev/null))
;;
"tcp6")
p_type="IPv6"
p_path=$(ipv6tcp $(grep -h -e " "$p_inode" " /proc/net/* 2>/dev/null))
;;
"udp6")
p_type="IPv6"
p_path=$(ipv6tcp $(grep -h -e " "$p_inode" " /proc/net/* 2>/dev/null))
;;
*)
p_path=$( readlink -n $procpath"/fd/"$f)
;;
esac
else
p_type="socket"
p_path=$( readlink -n $procpath"/fd/"$f)
fi
;;
"weird file")
p_type="a_inode"
p_path=$( readlink -n $procpath"/fd/"$f | cut -d ":" -f 2 )
;;
*)
p_type="?"
p_path=$( readlink -n $procpath"/fd/"$f)
;;
esac
#echo $(grep ${BASH_REMATCH[1]} /proc/net/* 2>/dev/null)
#echo "=-==="
printf "%-9s %4s %8s %4s %9s %2d,%2d %16s %16s %s\n" "$p_comm" $p_pid $p_user $f "$p_type" "$major" "$minor" $p_size $p_inode "$p_path" #| cut -c-$(tput cols)
fi
done
}
#MAIN
LANG=en_US.UTF8
printf "%-9s %4s %8s %4s %9s %4s %16s %15s %s\n" "COMMAND" "PID" "USER" "FD" "TYPE" "DEVICE" "SIZE" "NODE" "NAME"
if [ $# -eq 0 ]; then
for i in $(ls /proc/ | grep -E '^[0-9]+$' | sort -n); do
#echo $i
procfiles "$i"
done
fi
while getopts ":p:" opt; do
case $opt in
(p) procfiles "$OPTARG" ;;
esac
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment