通过双跳 SSH 连接服务器时终止远程进程

通过双跳 SSH 连接服务器时终止远程进程

我正在执行双跳 SSH,首先进入具有公共 IP 地址和开放 SSH 端口的服务器,然后通过 SSH 进入下一台计算机,同时将我的本地 VNC 端口链接到远程系统端口。在图中:

[我的本地系统] ---SSH 隧道(端口 5900 转发)--> [服务器] -- SSH 隧道(端口 5900 转发)--> [远程系统]

我已经创建了一个字符串命令来完成所有这些操作,但有一个问题。x11VNC 似乎崩溃得非常频繁。实际上,我可能在系统再次冻结之前完成了 10 分钟的工作,然后我必须重新启动 x11vnc。但这不是这个问题的重点。

我使用的命令如下:

ssh -L 5900:[REMOTE SYSTEM IP]:5900 [email protected] 'ssh [REMOTE SYSTEM IP] 'pkill x11vnc; x11vnc --ncache 10''

现在我在这里包含了 PKILL 命令,这样它就会清除仍在运行的冻结的 x11vnc 实例,这样我就可以释放端口 5900(并且不会有僵尸进程渗透到我的系统中):但是这不起作用。无论我做什么,如果它是双跳,这只会返回x11vnc,未找到命令

笔记:如果我删除 pkill,这个命令字符串就可以正常工作。但我需要杀死僵尸

但是,如果我从服务器尝试运行以下命令:

ssh [REMOTE SYSTEM IP] 'pkill x11vnc; x11vnc --ncache 10' 

一切正常!有人知道为什么在进行“双跳” ssh 连接时这不起作用吗?

答案1

从您的示例来看,您似乎将一组单引号嵌套在另一组单引号中。您需要“转义”内部引号和分号,如下所示:

ssh -L 5900:[REMOTE SYSTEM IP]:5900 [email protected] 'ssh [REMOTE SYSTEM IP] \'pkill x11vnc\; x11vnc --ncache 10\''

或者,您可以在运行 x11vnc 的系统上创建一个小的批处理文件。该脚本会为您执行 kill 和 x11vnc,然后您要做的就是运行该脚本作为最终命令。

答案2

我终于解决了这个问题。原来我需要在内部“”中使用 ` 而不是 '。(反引号(重音符)而不是单引号)

因此最终的有效命令是:

ssh -L 5900:[REMOTE SYSTEM IP]:5900 [email protected] 'ssh [REMOTE SYSTEM IP \`pkill x11vnc\; x11vnc --ncache 10\`'

相关内容