我有一个 sshfs/fuse 挂载文件夹和后台 2 个本地端口转发。
摘自这篇文章:
使用此命令,我只能看到我挂载的 sshfs/fuse 文件夹,而看不到本地端口转发连接。
ps -af |grep [s]sh
查看本地端口转发连接过程:
ps -x |grep "[s]sh -fN"
或者来自这篇文章:
lsof -i tcp:[PORT]
我可以使用以下命令终止本地端口转发连接的 1 个进程:
kill <id>
当我尝试使用以下命令关闭/终止该进程时:
ssh -O cancel -L [PORT]:[IP]:[PORT] [IP]
我收到如下错误信息:
No ControlPath specified for "-O" command
摘自这篇文章:
这个命令也不起作用:
pkill -f "ssh -f -N [REMOTE_IP]"
和
ssh -O exit [REMOTE_IP]
摘自这篇文章:
和
ssh -o ControlPath=$socket -O check
我收到
command-line line 0: Missing argument.
来自帖子:
如何判断 ssh ControlMaster 连接是否正在使用
我想关闭/终止某个端口的指定连接而不是全部,例如,如果我在具有不同端口的主机上建立了 3 个连接,则使用 ssh 命令而不是终止进程,例如:
ssh -O cancel -L ....
或其他 ssh 命令。
我该如何解决这个问题?我的错误在哪里?
ssh -O cancel -L [PORT]:[IP]:[PORT] [IP]
答案1
据我所知,取消端口转发时需要识别控制路径。
因此,当您创建端口转发时,您需要指定一个控制路径,例如 /tmp/mysshcontrolpath,即
ssh -o ControlMaster=auto -o ControlPath=/tmp/mysshcontrolpath -N -R [PORT]:[IP]:[PORT] [IP]
...然后,当您想要停止端口转发时,您将使用完全相同的方法,但要添加“-O exit”,即
ssh -o ControlMaster=auto -o ControlPath=/tmp/mysshcontrolpath -O exit -N -R [PORT]:[IP]:[PORT] [IP]
...然后您应该收到“退出请求已发送”的响应。
此外,我在创建端口转发时总是使用 ExitOnForwardFailure 选项,以便在尝试失败时它不会挂起,即
ssh -o ExitOnForwardFailure=yes -o ControlMaster=auto -o ControlPath=/tmp/mysshcontrolpath -N -R [PORT]:[IP]:[PORT] [IP]
我知道有些版本的 Linux 带有在 ~/.ssh/config 文件中预先指定的控制路径,因此在创建端口转发时无需指定控制路径。您可以在任何版本的 Linux 中创建此配置文件,如前所述这里。
希望这能为您提供一些线索,帮助您解决问题......
答案2
如果你知道进程的端口(这里是 8080),只需使用
kill $(lsof -t -i:8080)
在哪里
lsof -i:8080
为您提供所有 PID