假设我在端口 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 的进程,因此请使用lsof
或netstat
或ss
来查找。
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)