AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 436154
Accepted
Jer
Jer
Asked: 2018-04-08 02:12:39 +0800 CST2018-04-08 02:12:39 +0800 CST 2018-04-08 02:12:39 +0800 CST

试图将 lsof -Pi 的一些输出传递给 geoiplookup

  • 772

寻找一种将输出的第二列传递给 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>
bash lsof
  • 2 2 个回答
  • 363 Views

2 个回答

  • Voted
  1. Jer
    2018-04-12T08:53:57+08:002018-04-12T08:53:57+08:00

    这就是我最终得到的结果,这在很大程度上要感谢 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
    }
    
    • 1
  2. Best Answer
    RobotJohnny
    2018-04-12T01:42:43+08:002018-04-12T01:42:43+08:00

    在改进方面,这取决于lsof -Pi您对哪些数据感兴趣。

    这是一个打印命令、PID、用户、节点、IP、端口和geoip的“单线”(不是那么多..):

    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

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve