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

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

  •  3
     
  •   vision1900 · 363 天前 · 3904 次点击
    这是一个创建于 363 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  363 天前
    一些说明
    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 条附言  ·  360 天前
    update 2021-02-01, output format change, 详见 script 注释
    27 条回复    2021-01-29 11:27:51 +08:00
    yuananf
        1
    yuananf  
       363 天前 via Android   ❤️ 8
    看标题准备举报了,进来一看,打扰了
    jinliming2
        2
    jinliming2  
       363 天前   ❤️ 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  
       363 天前 via Android
    ss -antpl
    netstat -luntap
    lsof 最方便,不用装默认就有
    Pastsong
        4
    Pastsong  
       363 天前 via Android
    上来就跑一个网络地址的未知脚本也太不安全了吧。。
    felixcode
        5
    felixcode  
       363 天前 via Android
    ls 命令参数太多输出列太多也做个 curl 脚本?
    fzinfz
        6
    fzinfz  
       363 天前   ❤️ 1
    代码有点长。。。我写了个一行版本:
    netstat_keyword(){ netstat -lntup | grep --color -P "\b$1\b"; }

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

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