lsof -Piのいくつかの出力をgeoiplookupに渡してみてください。

lsof -Piのいくつかの出力をgeoiplookupに渡してみてください。

私は出力の2番目の列をgeoiplookupに渡す方法を探しています。なるべく同じ行にありますが、必ずしもそうではありません。それが私が招集できる最善だ。利用可能ですが、残念ながら、geoiplookupの結果は接続リストの下にあります。より包括的な結果が欲しい。誰もが改善を提案できれば大歓迎です。

ns () {
  echo ""
  while sleep 1; do
    lsof -Pi |
    grep ESTABLISHED |
    sed "s/[^:]*$//g" |
    sed "s/^[^:]*//g" |
    sed "s/://g" |
    sed "s/->/\t/g" |
    grep -v localdomain$ |
    tee >(for x in `grep -o "\S*$"`; do geoiplookup $x | sed "s/GeoIP.*: /\t/g"; done)
  done
}

現在の結果は次のとおりです。

<Port>    <URL or IP if no reverse available #1>
<Port>    <URL or IP if no reverse available #2>
    <geoiplookup trimmed result #1>
    <geoiplookup trimmed result #2>

答え1

これがRobotJohnnyのおかげで私が得た結果です。

ns () {
 echo ""
 while sleep 1; do
  IFS=$'\n'
  for line in $(lsof -Pi |
   grep ESTABLISHED |
   grep -ve "localdomain:[0-9]* .EST" \
    -e "search.msn.com:[0-9]* .EST" \
    -e "spider.yandex.com:[0-9]* .EST" \
    -e "google.com:[0-9]* .EST"); do
   cmdpidusr=$(echo $line | awk -v OFS='\t' '{print $1, $2, $3}')
   node=$(echo $line | awk '{print $8}')
   ipadd=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 1)
   port=$(echo $line | awk '{print $9}' | cut -d ">" -f 1 | cut -d ":" -f 2 | cut -d "-" -f 1)
   geoip=$(geoiplookup $ipadd | sed "s/GeoIP.*: \S* //g")
   echo -e "$cmdpidusr\t$node\t$port\t$ipadd\t$geoip" | sed "s/\s*resolve hostname.*//g" | grep -v root
  done | column -t -s $'\t' | sed "s/  \s*/  /g"
  unset IFS
 done
}

答え2

改善の面では、lsof -Pi関心のあるデータによって異なります。

以下は、コマンド、PID、ユーザー、ノード、IP、ポート、およびgeoipを印刷する「1行」です(別に...)。

echo -e "COMMAND\tPID\tUSER\tNODE\tIP\tPORT\tGEO"; IFS=$'\n'; for line in $(lsof -Pi | grep ESTABLISHED | grep -E '*(([0-9]{1,3})\.){3}([0-9]{1,3}){1})*'); do cmdpidusr=$(echo $line | awk '{print $1,$2,$3}'); node=$(echo $line | awk '{print $8}'); ipadd=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 1); port=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 2); geoip=$(geoiplookup $ipadd | cut -d : -f 2); echo -e "$cmdpidusr\t$node\t$ipadd\t$port\t$geoip"; done  | column -t; unset IFS

たとえば、出力は次のようになります。

┌─[root@Fedora]─[~]─[10:22 am]
└─[$]› echo -e "COMMAND\tPID\tUSER\tNODE\tIP\tPORT\tGEO"; IFS=$'\n'; for line in $(lsof -Pi | grep ESTABLISHED | grep -E '*(([0-9]{1,3})\.){3}([0-9]{1,3}){1})*'); do cmdpidusr=$(echo $line | awk '{print $1,$2,$3}'); node=$(echo $line | awk '{print $8}'); ipadd=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 1); port=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 2); geoip=$(geoiplookup $ipadd | cut -d : -f 2); echo -e "$cmdpidusr\t$node\t$ipadd\t$port\t$geoip"; done  | column -t; unset IFS

COMMAND   PID     USER    NODE    IP        PORT    GEO
synergys  16444   user1   TCP     172.1.1.1 59116   IP   Address  not  found
ssh       21557   root    TCP     1.2.3.4   2291    GB,  United   Kingdom

あなたがそれをあなたの機能や他のものにしたい場合は、.bashrc少し素敵に見えるようにすることができます。

iplookup() {
    echo -e "COMMAND\tPID\tUSER\tNODE\tIP\tPORT\tGEO"
    IFS=$'\n'     # set field separator to new line
    for line in $(lsof -Pi | grep ESTABLISHED | grep -E '*(([0-9]{1,3})\.){3}([0-9]{1,3}){1})*'); do     # this is just a regex grep to pull lines with valid IPv4 addresses only
        cmdpidusr=$(echo $line | awk '{print $1,$2,$3}')
        node=$(echo $line | awk '{print $8}')
        ipadd=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 1)
        port=$(echo $line | awk '{print $9}' | cut -d ">" -f 2 | cut -d ":" -f 2)
        geoip=$(geoiplookup $ipadd | cut -d : -f 2)
        echo -e "$cmdpidusr\t$node\t$ipadd\t$port\t$geoip"
    done | column -t # organise the columns
    unset IFS # set field separator to default
}

IPv6検索にはこれを使用する必要があるため、これは適用されませんgeoiplookup6。 IPタイプを確認する条件を追加したら、geoiplookup/6出力に応じて実行できます。例えば:

...
type=$(echo $line | awk '{print $5}')
if [ "$type" = "IPv4" ]; then
    geoip=$(geoiplookup $ipadd | cut -d : -f 2)
else
    geoip=$(geoiplookup6 $ipadd | cut -d : -f 2)
fi
...

ただし、上記のコードで使用するには、IPv4正規表現を削除するか、IPv6を含めるように追加する必要があります。

関連情報