Linux 用于本地(非远程)命令执行的ssh隧道
我想创建一个LinuxShell(bash-)脚本,它创建一个SSH隧道,运行一个使用该隧道的本地命令,最后关闭隧道和周围的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>,脚本是如何打开隧道的,在
为了便于解释,考虑到一个本地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