一般来说,我可以实时收听远程计算机上的音频:
ssh me@gate rec -t mp3 - | play -
例如,在名为的计算机上,gate
我可以执行命令rec
(或),并且音频流通过网络传输,因此我可以通过(或)命令sox
实时重播它。play
sox
这可以正常工作,特别是因为我可以从我的笔记本上无需密码访问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 -
在本地机器上。