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