-onlyssh
解决方案(对我不起作用)
@damienfrancois 的第二个建议是足够的,但由于某种原因,我不喜欢必须kill
做某事的想法。
另外,我不敢相信ssh
没有内置机制。确实如此。事情应该是这样的:
ssh remoteserver -o "PermitLocalCommand yes" -o "LocalCommand localclient --port 4444" \
-L 4444:targetserver:5555 -N
但是由于某种原因,这对我来说并没有像预期的那样工作:我首先尝试了一些简单的东西,比如w
forLocalCommand
但是-N
让命令挂起,所以我sleep 0
改用它,这似乎有效。
但是当我插入我的实际网络命令时,结果运行得非常慢。不是在不到一秒的时间内完成,而是在开始消息出现之前花了 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
终止,因为一旦第二个命令关闭其标准输入,shell 就会终止管道。
这比@damienfrancois 的解决方案更好吗?依靠。
需要keepalive.sh
是一个明显的缺点,但是无论如何以及为什么localclient
终止隧道的清理方式都更干净。
我需要在Makefile
上下文中使用它,并且喜欢它适合单行的事实。