私は出力の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を含めるように追加する必要があります。