我有一个运行 SSHD 的 Docker 容器,它接收来自多个远程计算机的 SSH 连接。我需要识别并终止来自一台特定机器的连接。
连接:
ssh
或在 ssh_config
中设置,这样可以更轻松地识别连接,我可以选择这样做。我所知道的:
到目前为止我尝试过的:
ps -aux
将向我显示所有传入连接的 SSHD 进程。但是,我无法判断哪个传入连接来自哪台远程计算机。cat /proc/net/unix
告诉我哪些套接字文件已打开,但不告诉我每个套接字文件由哪些进程打开lsof
应该列出哪些进程打开了哪些文件。但是,当我在只有一个传入连接时运行它来测试它时:
/proc/${PID}/cwd
、/proc/${PID}/root
、/proc/${PID}/exe
,以及/proc/${PID}/fd/
找到了解决方案:
lsof
可以告诉你哪些进程打开了给定的套接字文件。然而,默认情况下,Docker 会限制容器,使得容器内的进程无法读取 /proc/${PID}/fd/${FD_NUM}
,即使尝试读取的进程以 root 身份运行,这就是为什么 lsof
无法判断哪些进程拥有哪些文件打开了。
使用
--cap-add=SYS_PTRACE
运行 SSHD 容器会告诉 Docker 不要阻止此类操作,从而允许 lsof
正常工作。
更具体地说:
lsof -t "${SOCKET_FILE}"
将返回打开给定套接字文件的PID列表。