Linux 用于本地(非远程)命令执行的ssh隧道

Linux 用于本地(非远程)命令执行的ssh隧道,linux,bash,shell,ssh,Linux,Bash,Shell,Ssh,我想创建一个LinuxShell(bash-)脚本,它创建一个SSH隧道,运行一个使用该隧道的本地命令,最后关闭隧道和周围的SSH连接 为了便于解释,考虑到一个本地SSH配置给一个名为“ReloServer”的主机,它包含一个没有密码的本地私钥,所以 ssh-remoteserver-L 4444:targetserver:5555 将直接打开到远程服务器的连接,并创建从本地端口4444到目标服务器的隧道。考虑本地命令将是“代码>本地客户机-端口4444 < /COD>,脚本是如何打开隧道的,在

我想创建一个LinuxShell(bash-)脚本,它创建一个SSH隧道,运行一个使用该隧道的本地命令,最后关闭隧道和周围的SSH连接

为了便于解释,考虑到一个本地SSH配置给一个名为“ReloServer”的主机,它包含一个没有密码的本地私钥,所以

ssh-remoteserver-L 4444:targetserver:5555

将直接打开到远程服务器的连接,并创建从本地端口4444到目标服务器的隧道。考虑本地命令将是“代码>本地客户机-端口4444 < /COD>,脚本是如何打开隧道的,在本地客户机应用程序完成后执行本地命令并关闭隧道?”
由于应该可以保持其他正在进行的并行SSH连接,所以我不想要类似于
sudo killall SSH

的东西,您可以尝试类似的方法

TIMEOUT=60 # seconds
ssh remoteserver -L 4444:targetserver:5555 sleep $TIMEOUT &
localclient --port 4444
隧道将在$TIMEOUT秒后自动关闭。请注意,使用
&
仅对无密码连接有效。否则,您需要使用SSH的
-f
标志

或者

ssh -N remoteserver -L 4444:targetserver:5555 &
sshpid=$!
localclient --port 4444
kill $sshpid
将在执行
localclient
后立即终止隧道。请注意,这将不适用于
-f
标志,因为该进程是双叉的。

一个
ssh
唯一的解决方案(不适用于我) @damienfrancois的第二个建议很恰当,但是 出于某种原因,我不喜欢必须杀掉的想法 什么

而且,我无法相信
ssh
没有用于此的内置机制。 确实如此。事情应该是这样的:

但出于某种原因,这并没有像我预期的那样起作用: 我首先尝试了一些简单的方法,比如
w
,用于
LocalCommand
但是
-N
使命令挂起,因此我使用
睡眠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
需要
睡眠0.5
来确保(某种程度上) 隧道是在
localclient
启动之前设置的 (对于距离较远或速度较慢的
远程服务器
,您可能需要更长的等待时间)。 隧道将在
localclient
完成后立即终止 因为外壳会在管道发生故障时立即终止管道 第二个命令关闭其标准输入

这比damienfrancois的解决方案好吗?视情况而定

需要
keepalive.sh
是一个明显的缺点,但是 隧道被清除的方式,无论
localclient
终止的方式和原因更清晰

我需要在
Makefile
上下文中使用它,并且喜欢它适合的事实 一行

while true; do
   sleep 1
   echo "keepalive"
done