V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
vision1900
V2EX  ›  Linux

写了个 bash 脚本用于 3P 互查

  •  3
     
  •   vision1900 · 2021-01-28 23:42:32 +08:00 · 4852 次点击
    这是一个创建于 1394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    3P => Program, Pid, Port

    在 Linux 下有好几种工具来做 program(程序名), pid(进程号), port(端口) 之间的对应

    1. ps 做了 pid 和 program 之间的对应
    2. netstat 做了 port 和 pid/program 之间的对应
    3. pgrep 做了	program 和 pid 之间的对应
    ...
    

    ps 和 netstat 很强大,但是参数多而且很多输出列其实无关紧要,pgrep 默认不是 exact match, 比如 pgrep ss 会把 sshd 的 pid 也输出出来。

    更重要的是,对于普通用户来说,很多只关心 3 个核心参数: program, pid 和 port

    今天我用 bash 实现了三者互查:

    1. 给 port 会输出对应的 pid 和 program name; 
    2. 给 pid 会输出 program name 和 port(s) (如果没有会是 none, 如果有多个会以空格为间隔输出)
    3. 给 program 会输出所有对应进程的 pid, 以及每个 pid 对应的 port(s)
    

    当然如果输入的参数无效,回给提示并返回一个非 0 的状态码

    这是地址: https://github.com/librz/shell_scripts/blob/main/3p.sh

    我是在 .zshrc 里写了一个 alias:

    alias 3p="bash <(curl -sL https://raw.githubusercontent.com/librz/shell_scripts/main/3p.sh)"
    

    这样就能直接用了, 以下是一些例子:

    # who's listening on port 9000?
    3p --port 9000
    
    # I have pid 1234, what kind of program is it? is it using any port?
    3p --pid 1234
    
    # I want to see all process and ports related to node
    3p --program node
    

    我知道很多前辈肯定已经写过这种程序,但自己还是要写一遍,哈哈

    第 1 条附言  ·  2021-01-29 11:23:45 +08:00
    一些说明
    1. 之所以取名 3p.sh 是因为我想不到更好更简洁的名字了,之前叫 ppp.sh

    2. 关于用 curl 导致的速度和安全问题。脚本大小只有 4 KB,网速正常也就百毫秒延迟,这点耐心还是有的,如果追求极致那就下到本地呗。安全问题对我几乎不存在,毕竟自己写的脚本。大家要是觉得不安全,可以审计甚至修改脚本内容。

    3. 可能是我描述的不够详细,我想要的是格式化的极简输出。ps 输出的程序名是带路径的比如:/usr/bin/python3 这种,而我只想要 python3. 而且 ps 不能给出端口信息。netstat 是给出了端口信息,但试想这样一种情况,我想要查程序 a 的所有 pid 及其 port, 但是 a 可能在监听端口也可能没在,如果没在, 用 netstat 什么也打印不出来,想要的 pid 信息也丢失了. 关于格式化,如果 exit code 是 0 的话,那么脚本一定会输出

    program:{{program name}} pid:{{process id}} port: {{port number}}

    这个输出可能是多行的,每一行代表一个进程,用 wc -l 来数一下就知道有多少个对应进程。此外,没有 port 的时候会输出 none 。
    格式化的好处也意味着模块化,输出可以很容易被其他代码解析并利用

    4. 二楼大佬提到了 lsof, 我还得好好了解下
    第 2 条附言  ·  2021-02-01 10:46:42 +08:00
    update 2021-02-01, output format change, 详见 script 注释
    27 条回复    2021-01-29 11:27:51 +08:00
    yuananf
        1
    yuananf  
       2021-01-29 00:21:46 +08:00 via Android   ❤️ 8
    看标题准备举报了,进来一看,打扰了
    jinliming2
        2
    jinliming2  
       2021-01-29 00:37:58 +08:00   ❤️ 8
    emmmm,alias 里写个 curl 真的不觉得慢吗……要是网突然断了怎么办……
    我是习惯于直接 lsof 。
    比如端口 lsof -i:9000 、lsof -iTCP:9000 、lsof -iUDP:9000
    查 PID 的端口:lsof -i -ap1234 、lsof -iTCP -ap1234 、lsof -iUDP -ap1234
    查进程名的端口:lsof -i -ac node 、lsof -i:TCP -ac node 、lsof -i:UDP -ac node 。并且支持正则:lsof -i -ac '/Node$/i'
    sleepm
        3
    sleepm  
       2021-01-29 01:17:20 +08:00 via Android
    ss -antpl
    netstat -luntap
    lsof 最方便,不用装默认就有
    Pastsong
        4
    Pastsong  
       2021-01-29 01:22:44 +08:00 via Android
    上来就跑一个网络地址的未知脚本也太不安全了吧。。
    felixcode
        5
    felixcode  
       2021-01-29 02:07:26 +08:00 via Android
    ls 命令参数太多输出列太多也做个 curl 脚本?
    fzinfz
        6
    fzinfz  
       2021-01-29 02:29:26 +08:00   ❤️ 1
    代码有点长。。。我写了个一行版本:
    netstat_keyword(){ netstat -lntup | grep --color -P "\b$1\b"; }

    感觉也能实现楼主需求?
    ihwbunny
        7
    ihwbunny  
       2021-01-29 04:30:20 +08:00
    👍 鼓励楼主
    df4VW
        8
    df4VW  
       2021-01-29 04:53:15 +08:00   ❤️ 1
    确实不是我想的 3p
    blogfeng
        9
    blogfeng  
       2021-01-29 07:57:54 +08:00 via Android
    进来前想举报,进来后更想举报。
    css3
        10
    css3  
       2021-01-29 08:17:54 +08:00 via iPhone
    @jinliming2 学习了,老哥
    nieqibest
        11
    nieqibest  
       2021-01-29 08:20:45 +08:00 via Android
    @sleepm 啥版本默认装 lsof
    masker
        12
    masker  
       2021-01-29 08:35:16 +08:00 via Android
    这。。。。。。。
    sleepm
        13
    sleepm  
       2021-01-29 09:17:34 +08:00
    @nieqibest ubuntu 20.10 还有 20.04.1 LTS
    DevAlex
        14
    DevAlex  
       2021-01-29 09:19:59 +08:00
    略感失望 0.0
    Tumblr
        15
    Tumblr  
       2021-01-29 09:34:51 +08:00
    抱着猎奇的心情来😍,带着失望的心情走😌
    40EaE5uJO3Xt1VVa
        16
    40EaE5uJO3Xt1VVa  
       2021-01-29 09:37:27 +08:00
    centos 好像没有默认张 lsof
    0ZXYDDu796nVCFxq
        17
    0ZXYDDu796nVCFxq  
       2021-01-29 09:41:14 +08:00 via Android
    Shell 配置里直接写个远程脚本……
    matrix67
        18
    matrix67  
       2021-01-29 09:44:02 +08:00
    @gstqc #17 的确不妥,而且现在还有个 sudo 提权漏洞,分分钟给你....
    ScotGu
        19
    ScotGu  
       2021-01-29 10:17:49 +08:00
    哎哟~ 额, 学习了!谢谢 LZ 分享。

    转头骂骂咧咧走开了。
    Aynamic
        20
    Aynamic  
       2021-01-29 10:25:20 +08:00 via iPhone
    嫌弃列多用 awk 选择需要的列不就好了?
    IceMimosa
        21
    IceMimosa  
       2021-01-29 10:39:33 +08:00
    奇怪的词语又增加了。。
    dimlau
        22
    dimlau  
       2021-01-29 10:40:50 +08:00
    不是我理解的那种使用场景诶……
    piecezzz
        23
    piecezzz  
       2021-01-29 10:51:44 +08:00
    啊这
    vision1900
        24
    vision1900  
    OP
       2021-01-29 11:00:36 +08:00
    @jinliming2 原来 lsof 这么强大,之前有遇见过,list open files, 看来是把 sockets 也看成文件了,回头再看看,学习了
    tikazyq
        25
    tikazyq  
       2021-01-29 11:03:07 +08:00
    我 xx 都拖了,就给看这
    someonedeng
        26
    someonedeng  
       2021-01-29 11:11:52 +08:00
    没点进来还以为什么敏感的查询网站呢
    Thresh
        27
    Thresh  
       2021-01-29 11:27:51 +08:00
    确实不是我想想中的 3p,差评。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2862 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:51 · PVG 10:51 · LAX 18:51 · JFK 21:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.