技术解析

写了个 bash 脚本用于 3P 互查
0
2021-06-15 09:53:23
idczone

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

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


看标题准备举报了,进来一看,打扰了

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'

ss -antpl
netstat -luntap
lsof 最方便,不用装默认就有

上来就跑一个网络地址的未知脚本也太不安全了吧。。

ls 命令参数太多输出列太多也做个 curl 脚本?

代码有点长。。。我写了个一行版本:
netstat_keyword(){ netstat -lntup | grep --color -P "\b$1\b"; }
感觉也能实现楼主需求?

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服