我有一个 debian 安装,其中 OEM 有一堆我无法识别的进程正在运行,我想弄清楚这些进程中是否有任何进程正在拨通。
我跑了sudo tcpdump | grep ^e <ssh_ip>
但管道不断破裂。我是通过 ssh 连接的,grep ^e 是省略我客户端的 ssh ip。有没有办法持续监控出站请求的网络连接?我不知道这件事会打电话回家,或者具体在哪里,我只是怀疑它确实如此,来自与这个问题无关的其他行为。
管道损坏通常意味着连接中断,但我的 ssh 连接很好,这似乎是 tcpdump 需要做的其他事情
答案1
在:
sudo tcpdump | grep ^e <ssh_ip>
首先,^e
根据 shell 的不同,它具有不同的含义。
- 在 Bourne shell 中,是(
^
的别名,最初呈现得更像是其前身 Thompson shell 中的管道运算符),因此您可以通过管道来执行命令。|
^
↑
grep
e
- 在
fish
3.2 之前的版本中,^
用于重定向 stderr( 的缩写2>
)。 - in
rc
和 导数,^
是一种串联运算符,因此grep ^e
将变为grepe
。 - in
zsh -o extendedglob
,^
是一个否定全局运算符,因此^e
将扩展到当前目录中除名为 的文件之外的所有非隐藏文件e
。 - 在
csh
//tcsh
/中,bash
仅在行开头且仅在未禁用历史扩展时才特殊。所以不在这里。zsh
^
- 在大多数其他 shell 中,
^e
将按字面意思传递给grep
.
因此,假设后面的 shell 之一,该命令将启动sudo tcpdump
,并且grep ^e <ssh_ip>
与一个通过管道连接到另一个 shell 的输入的输出同时进行。
参数的语法grep
为grep [<options>] <regular-expression> [<files>]
([...]
表示可选部分)。如果没有文件,grep
则 grep 其标准输入。选项以-
角色开头。
这^e
是正则表达式,也是<ssh_ip>
用于查找与该正则表达式匹配的行的文件。
作为正则表达式,^e
匹配后跟 的行的开头e
,以便报告以 开头的行e
。
在这里,该文件很可能<ssh_ip>
不存在,因此grep
将立即返回并显示错误。
此时,tcpdump
继承自 s 的 stdoutsudo
将成为一个损坏的管道,因此第一次tcpdump
尝试输出某些内容时,它将收到 SIGPIPE 信号并死亡,或者如果它忽略该信号,它将write()
因错误而失败EPIPE
。在这里,tcpdump 设法写入错误消息表明它要么忽略该信号并报告其失败write()
,要么它有一个处理程序并在终止之前报告其接收情况。
如果您想从 的输出中过滤掉包含 IP 地址的行tcpdump
,则需要将grep -Fvw <ssh_ip>
where-F
和here 捆绑在一起在一个参数中-v
,-w
并且分别表示
- 匹配
F
固定字符串而不是正则表达式(用于.
匹配文字.
而不是像正则表达式中那样匹配任何单个字符)。 - 重新
v
匹配:返回匹配的行不匹配。 - 仅匹配订单(例如在其中
w
找不到<ssh_ip>
== )。10.10.10.10
210.10.10.109
默认情况下,当 tcpdump 检测到其输出没有发送到终端时,它会恢复为块缓冲,因此,如果您希望在输出到来时立即看到输出,您可能需要-l
向 tcpdump 添加选项以重新启用线缓冲。
但无论如何,tcpdump 可以自己过滤数据包。在这里,要排除来自/到给定 IP 地址的数据包,您只需要:
sudo tcpdump not host <ssh_ip>
或者仅过滤来自该 IP 地址的 ssh 流量:
sudo tcpdump 'not (host <ssh_ip> and tcp port ssh)'
(假设 ssh 连接位于默认端口 22)。
这些过滤器(伯克利数据包过滤器,BPF)被编译成传递到内核的二进制过滤器表达式(setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, filter)
至少在 Linux 上)。过滤是在那里进行的,因此对于 tcpdump 和系统来说,实际上比 tcpdump 请求所有流量、解码所有流量并将其传递给 grep 的工作量要少。
wireshark
,它的命令行界面tshark
是一个更先进的流量分析应用程序,您可能也想在这里考虑。它们支持两种类型的过滤器:上面称为 BPF 的过滤器捕获过滤器(通过-f
)和一个显示过滤器(通过 传递-Y
)使用wireshark自己的过滤器语法和更高级的功能进一步应用于内核返回的数据包。
或递归进入当前工作目录(如果在最新版本的 GNU 实现中给出了-r
/选项) 。-R
grep