从所有当前隧道中高效定位特定 SSH 隧道?

从所有当前隧道中高效定位特定 SSH 隧道?

假设我在端口 22 上使用 OpenSSH 登录,然后还通过隧道传输了端口 3306 和 80。

端口 80 是最后一个从所有三个端口(22、3306、80)建立隧道的端口:

$ sudo ssh UWU@IP -L 80:localhost:80

如何只终止 80 端口隧道进程?

我相信最好的方法是以某种方式自动瞄准端口 80 隧道。另一种方法是瞄准 3 个隧道中的最后一个。

为什么我问这个:

我可以ps aux | grep ssh找到该进程,然后专门杀死它,但这不是自动的。

答案1

我建议使用语法来定位相关进程的 PID $!

阶段1:启动该进程,但这次使用保存任意 PID 值的变量:

sudo ssh blah@blah 80:localhost:80 & arbpid=$!

第二阶段:如果仅在创建隧道时保存变量arbpid,您可以使用它来在脚本末尾终止进程:

kill $arbpid

换句话说,我们在这里所做的是用任意标记(这是一个变量及其值)来标记 ssh 隧道,然后我们用它来定位查杀。


请注意,命令和变量之间有一个 & 符号。与 Unix 命令后面的单个 & 符号一样,这是为了使 & 符号之前的命令在不同的子进程(后台)中运行,而第二个命令(在本例中创建变量)将在当前进程(前台)中运行。

答案2

如果您知道命令行中的唯一字符串,则可以使用pkill

pkill -f "80:localhost:80"

-f标志导致pkill搜索整个命令行;如果没有该标志,它只会根据进程名称杀死匹配项,而忽略参数。

答案3

提供隧道的进程是侦听端口 80 的进程,因此请使用lsofnetstatss来查找。

lsof -n -i TCP:80 -sTCP:LISTEN -Fp |sed 's/^p//'
netstat -ntlp | awk '$4 ~ /:80$/ {sub(/\/.*/, "", $7); print $7}'
ss -nlpt 'sport = :80' | awk 'NR>1 {split($6, a, ","); print a[2]}'

请注意,如果您使用连接多路复用,这将杀死同一进程提供的所有连接。如果您使用多路复用,则可以使用控制命令告诉主进程停止转发cancel

ssh UWU@IP -S … -O cancel -L 80:localhost:80

答案4

这可以让你终止最后一个 SSH 隧道进程:

kill $(history | grep ssh | tail -n 2 | head -n 1| cut -d' ' -f 2)

相关内容