![SSH 主机进程如何检测哪些端口已被客户端转发(-R 而不是 -L)](https://linux22.com/image/571033/SSH%20%E4%B8%BB%E6%9C%BA%E8%BF%9B%E7%A8%8B%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%E5%93%AA%E4%BA%9B%E7%AB%AF%E5%8F%A3%E5%B7%B2%E8%A2%AB%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BD%AC%E5%8F%91%EF%BC%88-R%20%E8%80%8C%E4%B8%8D%E6%98%AF%20-L%EF%BC%89.png)
(我无法决定是在这里还是在 SuperUser 上发布这个,但由于这是出于系统管理员的目的,所以这似乎更合适)
我遇到过这样的情况:SSH 客户端将使用 SSH 选项请求端口转发-R
。在连接时,我希望能够记录它们转发了哪些端口。
我计划通过强制运行特定命令(即command=my-command
在authorized_keys
文件中)来执行此操作,该命令将执行此日志记录,然后运行原始命令(登录或用户指定)。
到目前为止我发现的唯一方法需要运行sudo
并且感觉很不安全:
sudo lsof [email protected] -Fn -p12345 | grep "^n" | grep -v '\->' | awk -F: '{print $NF}' | sort | uniq
*处理此连接12345
的进程 ID 在哪里sshd
(即我运行来检查它的任何脚本的父进程)。
有没有更优雅的东西(例如SSH_*
为其他连接信息设置的环境变量)可以提供给我?
* 出于好奇,该命令的第一部分获取绑定到属于进程 12345 ( ) 的本地接口 ( [email protected]
) 和 ( ) 的所有网络端口,并将其格式化为机器可读的 ( )。and标志使其提供原始端口号和网络地址。第二部分 ( ) 仅返回网络信息。下一部分 ( ) 消除已建立的连接(从而留下“监听”端口)。下一部分 ( ) 使用 awk 获取由“:”分隔的最后一个字段,为我提供端口(我在这里不使用 cut,因为对于 IPv6 连接,字段编号可能会更改)。最后两部分仅给我一个唯一的端口列表。我在这里解释这个,因为这是一个很棒的命令,每个人都应该知道。-a
-p12345
-Fn
-P
-n
grep "^n"
grep -v '\->'
awk -F: '{print $NF}'
lsof
答案1
您可以将 sshd 的日志记录级别设置为DEBUG1
,然后 grep 日志,您将会找到如下行:
Dec 25 21:40:25 d34dh0r53 sshd[21963]: debug1: Local forwarding listening on ::1 port 8085.
根据您使用的日志文件和权限,您无需以 root 身份读取它。
答案2
ssh ~ 密钥?
~# 列出转发的连接。