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

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

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

    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 学习了,老哥
    stefanaka
        11
    stefanaka  
       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     Solana     1029 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 18:38 PVG 02:38 LAX 11:38 JFK 14:38
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86