嵌套 ssh 命令转发

嵌套 ssh 命令转发

一般来说,我可以实时收听远程计算机上的音频:

ssh me@gate rec -t mp3 - | play -

例如,在名为的计算机上,gate我可以执行命令rec(或),并且音频流通过网络传输,因此我可以通过(或)命令sox实时重播它。playsox

这可以正常工作,特别是因为我可以从我的笔记本上无需密码访问gate(使用authorized_keys & authorized_keys2)。

但我的拓扑是:

+----+  internet   +------+  lan   +----------+
| my | ----------> | gate | -----> | internal |
+----+             +------+        +----------+

rec我需要在计算机上执行internal,然后它stdout应该通过管道传输到计算机play中的命令my

因此,当我将 s 级联(嵌套)时,如下ssh所示:

ssh -t me@gate ssh me@internal rec -t mp3 -

(请-t注意ssh

  • 因此gate无需密码即可访问
  • 执行gate第二个(嵌套)ssh
  • 所以internal要求我输入密码(-t
  • 当我输入密码时,internal正确启动rec命令
  • 我可以在本地终端上看到接收到的二进制数据垃圾。

不幸的是,当我尝试通过管道传输时,这不起作用play,例如这个

ssh -t me@gate ssh me@internal rec -t mp3 - | play -

不起作用,因为Password:字符串被重定向(例如我没有提示输入密码),并且play感到困惑。

me@gate在->之间设置无密码访问me@internal可能可以解决问题,但我不想这个——我想手动输入internal电脑密码。

知道如何解决这个问题吗?

答案1

我假设internal在标准22端口上监听。

首先建一条隧道:

ssh -N -L localhost:2222:internal:22 me@gate
# you can put it to background with &

然后通过隧道连接。此连接将结束于internal

ssh -p 2222 me@localhost rec -t mp3 - | play -

internal无论是否使用了管道,您都应该被要求输入密码。


ssh -L …解释为我对另一个问题的回答

答案2

我认为如果您的笔记本电脑能够直接访问,密码提示就不会妨碍您internal

如果是这样,请尝试一下ProxyCommand配置选项。

把类似的东西放在你的~/.ssh/config

Host internal-via-gate
    User me
    Hostname internal
    Port 22
    ProxyCommand ssh gate nc %h %p

这样您就可以简单地运行ssh internal-via-gate,就像直接连接一样。


如果没有,那么也许可以考虑端口转发:

Host internal-via-gate
    User me
    Hostname internal
    Port 22
    ProxyCommand ssh gate nc %h %p
    LocalForward 27015 localhost:27015

然后,连接并验证(ssh internal-via-gate)。

登录后,运行:

  • rec -t mp3 - | nc -l 27015在遥控器上,
  • nc localhost 27015 | play -在本地机器上。

相关内容