【问题标题】:ssh tunnel for local (not remote) command execution用于本地(非远程)命令执行的 ssh 隧道
【发布时间】:2013-10-28 11:14:23
【问题描述】:

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

为了让这更容易解释,请考虑一个名为“remoteserver”的主机的本地 SSH 配置,其中包含没有密码的本地私钥,所以

ssh remoteserver -L 4444:targetserver:5555

将直接打开到远程服务器的连接并创建从本地端口 4444 到目标服务器的隧道。考虑一下本地命令是localclient --port 4444,在本地客户端应用程序完成后,打开隧道、执行本地命令并关闭隧道的脚本会是什么样子?

因为应该可以保持其他并行的持续 SSH 连接,所以我不想要像 sudo killall ssh 这样的东西。

【问题讨论】:

    标签: linux bash shell ssh


    【解决方案1】:

    你可以试试

    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 标志,因为该进程是双分叉的。

    【讨论】:

      【解决方案2】:

      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 上下文中使用它,并且喜欢它适合的事实 一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-06
        • 2020-07-28
        • 2017-06-02
        • 2020-11-02
        • 2015-03-29
        • 2021-05-11
        • 2015-12-02
        • 2014-06-18
        相关资源
        最近更新 更多