Bash脚本和反向ssh隧道

时间:2018-03-22 15:40:10

标签: bash ssh

我想写一个bash脚本,允许我连接可能位于firewallNAT后面的设备(不知何故无法直接连接)。在某些情况下,我的脚本应该建立与myserver(具有公共IP)的反向ssh连接,并向某个端点发出get请求以发送隧道端口号和设备mac。

我使用以下命令建立ssh连接

ssh -R "*:0:localhost:22" -N -T mypi@myserver

此命令连接myserver的端口22(ssh-server将侦听)并打开到随机端口的隧道。打印到stdout

的端口号
Allocated port 33238 for remote forward to localhost:22

我想要的只是向服务器发出GET请求,并将此port号码与设备macId一起发送。当有多个设备时,如果不知道哪个设备通过隧道连接到服务器上的哪个端口,很难找到,我想解决这个问题。我无法使端口静态,因为有很多设备可能想要同时连接。

但是,我用于ssh隧道的命令阻塞了输出​​,因此当我尝试使用以下代码读取stdout时,它不会像预期的那样中断while循环。

myssh-command |
  while IFS= read -r line
  do
    echo "$line"
  done

如果我使用ssh的-f标志将命令放在后台,我无法阅读stdout

总结一下,我卡住了,我是bash脚本中的新手。有没有办法在后台执行反向ssh隧道并同时从stdout获取端口号?

1 个答案:

答案 0 :(得分:0)

一种方法是使用

将ssh进程放在后台
ssh ..... > fileWithPortNumber &

然后读取文件以找出端口号。 这有点像你在寻找什么?如果是这样,请在互联网上搜索 bash job control 以获取更多信息。