pastebin - collaborative debugging tool
rovema.kpaste.net RSS


list_active_local_tcp_ports1.ksh - list port numbers of local TCP connections
Posted by Anonymous on Mon 27th Feb 2023 10:39
raw | new post
view followups (newest first): list_active_local_tcp_ports1.ksh - list port numbers of local TCP connections by Anonymous
modification of post by Anonymous (view diff)

  1. #!/usr/bin/ksh93
  2.  
  3. #
  4. # list_active_local_tcp_ports1.ksh - list port numbers of local TCP connections
  5. #
  6. # Written by Roland Mainz <roland.mainz@nrubsig.org>
  7. #
  8.  
  9. #    
  10. # simple netstat -n parser
  11. #    
  12. function netstat_list_connections
  13. {
  14.         set -o nounset
  15.         nameref data=$1
  16.        
  17.         compound out=( typeset stdout stderr ; integer res )
  18.        
  19.         out.stderr="${ { out.stdout="${ LC_ALL='POSIX' /usr/bin/netstat -n ; (( out.res=$? )) ; }" ; } 2>&1 ; }"
  20.         if (( out.res != 0 )) || [[ ${out.stderr} != '' ]] ; then
  21.                 return 1
  22.         fi
  23.  
  24.         typeset -a data.connections
  25.         typeset l
  26.         integer dci=0 # data.connections array index
  27.  
  28.         while read l ; do
  29.                 leftover="${l/~(Elrx)
  30.                 (?: # non-capturing group
  31.                         #
  32.                         # regex group for tcp,udp
  33.                         #
  34.                         (tcp|tcp6|udp)                  # Proto
  35.                         [[:space:]]+
  36.                         ([[:digit:]]+)                  # Recv-Q
  37.                         [[:space:]]+
  38.                         ([[:digit:]]+)                  # Send-Q
  39.                         [[:space:]]+
  40.                         ([^[:space:]]+)                 # Local Address
  41.                         [[:space:]]+
  42.                         ([^[:space:]]+)                 # Foreign Address
  43.                         [[:space:]]+
  44.                         ([^[:space:]]+)                 # State
  45.                 |
  46.                         #
  47.                         # regex for unix
  48.                         #
  49.                         (unix)                          # Proto
  50.                         [[:space:]]+
  51.                         ([[:digit:]]+)                  # RefCnt
  52.                         [[:space:]]+
  53.                         (\[.+?\])                       # Flags
  54.                         [[:space:]]+
  55.                         ([^[:space:]]+)                 # Type
  56.                         [[:space:]]+
  57.                         ([^[:space:]]*?)                # State (optional)
  58.                         [[:space:]]+
  59.                         ([[:digit:]]+)                  # I-Node
  60.                         (?:
  61.                                 |
  62.                                 [[:space:]]+
  63.                                 ([^[:space:]]+)         # Path (optional)
  64.                         )
  65.                 )
  66.                         /X}"
  67.        
  68.                 # If the regex above did not match then .sh.match
  69.                 # remains untouched, so we might see data from the
  70.                 # previous round.
  71.                 # So we check the "leftover" var whether it just
  72.                 # contains the dummy value of "X" to indicate a
  73.                 # successful regex match
  74.                 if [[ "$leftover" == 'X' ]] ; then
  75.                         #print -v .sh.match
  76.                        
  77.                         if [[ "${.sh.match[1]-}" != '' ]] ; then
  78.                                 nameref dcn=data.connections[$dci]
  79.  
  80.                                 typeset dcn.proto="${.sh.match[1]}"
  81.                                 typeset dcn.recv_q="${.sh.match[2]}"
  82.                                 typeset dcn.send_q="${.sh.match[3]}"
  83.                                 typeset dcn.local_address="${.sh.match[4]}"
  84.                                 typeset dcn.foreign_address="${.sh.match[5]}"
  85.                                 typeset dcn.state="${.sh.match[6]}"
  86.                                 ((dci++))
  87.                         elif [[ "${.sh.match[7]-}" != '' ]] ; then
  88.                                 nameref dcn=data.connections[$dci]
  89.  
  90.                                 typeset dcn.proto="${.sh.match[7]}"
  91.                                 typeset dcn.refcnt="${.sh.match[8]}"
  92.                                 typeset dcn.flags="${.sh.match[9]}"
  93.                                 typeset dcn.type="${.sh.match[10]}"
  94.                                 [[ "${.sh.match[11]}" != '' ]] && typeset dcn.state="${.sh.match[11]}"
  95.                                 typeset dcn.inode="${.sh.match[12]}"
  96.                                 [[ "${.sh.match[13]}" != '' ]] && typeset dcn.path="${.sh.match[13]}"
  97.                                 ((dci++))
  98.                         fi
  99.                 else
  100.                         true
  101.                         #printf $"leftover=%q\n" "${leftover}"
  102.                 fi
  103.         done <<<"${out.stdout}"
  104.        
  105.         return 0
  106. }        
  107.  
  108. function netstat_list_active_local_tcp_connections
  109. {
  110.         set -o nounset
  111.         nameref ar=$1
  112.         compound c
  113.         integer port
  114.         integer i
  115.  
  116.         netstat_list_connections c || return 1
  117. #       print -v c
  118.        
  119.         [[ -v ar ]] || integer -a ar
  120.  
  121.         for i in "${!c.connections[@]}" ; do
  122.                 nameref n=c.connections[$i]
  123.                
  124.                 # look for only for TCP connections which match
  125.                 # 127.0.*.* or IPv6 ::1
  126.                 if [[ "${n.proto}" == ~(El)tcp && \
  127.                         "${n.local_address}" == ~(Elr)(127\.0\..+|::1):[[:digit:]]+ ]] ; then
  128.  
  129.                         port="${n.local_address##*:}"
  130.                         #printf $"port = %d\n" port
  131.  
  132.                         (( ar[port]=1 ))
  133.                 fi
  134.         done
  135.  
  136.         return 0
  137. }
  138.  
  139. function main
  140. {
  141.         set -o nounset
  142.         compound c=( integer -a ar )
  143.  
  144.         netstat_list_active_local_tcp_connections c.ar || return 1
  145.  
  146. #       print -v c
  147.         (( ${#c.ar[@]} > 0 )) && printf $"%d\n" "${!c.ar[@]}"
  148.        
  149.         return 0
  150. }
  151.  
  152. # main entry point
  153. main
  154. exit $?
  155. # EOF.

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at