ssh-only 解决方案(对我不起作用)
@damienfrancois 的第二个建议是足够的,但是
出于某种原因,我不喜欢必须kill
东西。
另外,我不敢相信ssh 没有内置机制。
确实如此。这就是应该工作的方式:
ssh remoteserver -o "PermitLocalCommand yes" -o "LocalCommand localclient --port 4444" \
-L 4444:targetserver:5555 -N
但由于某种原因,这对我来说并没有按预期工作:
我首先尝试使用w 等简单的LocalCommand
但是-N 使命令挂起,所以我改用sleep 0,
这似乎有效。
但是当我插入我的实际网络命令时,结果运行
极其缓慢。而不是在不到一秒的时间内完成,
在 start 消息出现之前花了 40 秒。
我在 20 分钟后终止了命令。
管道解决方案(对我有用)
经过一些实验,这是我现在使用的:
ssh remoteserver -L 4444:targetserver:5555 keepalive.sh \
| (sleep 0.5; localclient --port 4444)
远程端的keepalive.sh 是这样的:
while true; do
sleep 1
echo "keepalive"
done
需要sleep 0.5 来确定(某种程度上)
隧道在localclient 开始之前建立
(对于遥远或缓慢的remoteserver,您可能需要更长的等待时间)。
隧道在localclient 完成后立即终止
因为外壳会立即终止管道
第二个命令关闭其标准输入。
这比@damienfrancois 的解决方案更好吗?视情况而定。
需要keepalive.sh 是一个明显的缺点,但是
无论如何清理隧道的方式
localclient 终止的方式和原因更清晰。
我需要在 Makefile 上下文中使用它,并且喜欢它适合的事实
一行。