如果 telnet 输出包含某些执行操作

If telnet output contains something execute action

我正在尝试在 bash 中编写一个小脚本。我的目标是我的 FritzBox 上的 Phone 呼叫将使我的电视静音或暂停。

我在我的 RaspberryPi 上通过 telnet (telnet fritz.box 1012) 获取呼叫信息,如果有 phone 呼叫进来,我会得到以下输出:

24.08.15 14:03:05;RING;0;017mobilephonenumber;49304myhomenumber;SIP0;

唯一每次相同的部分是来电号码前的RING。我需要的是一个检查 telnet 输出的脚本,如果在 telnet 输出中是一个环而不是执行一个操作,在我的情况下我只需要在内部站点上执行 http 请求或启动另一个脚本。

这是我试过的:

#!/bin/bash

#string='echo "My string"'
string=$(telnet –e p fritz.box 1012)
for reqsubstr in 'alt' 'RING';do
  if [ -z "${string##*$reqsubstr*}" ] ;then
      echo "String '$string' contain substring: '$reqsubstr'."
    else
      echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
  done

但我没有将 telnet 会话的输出放入字符串中。谁能帮帮我?

您可以访问 expect 吗?它正是为这种情况而设计的。 man expect是你的朋友,我通过google找到了a fair tutorial。如果你 google for modem expect 你可以找到这种情况的示例脚本(我也可以找到一些 FritzBox 但不确定它是否与你的相同)。不过我好久没用了。

在你发表最新评论并再次阅读你的问题后,我认为我们可以根据 nc (netcat) 来做一些更简单的事情。

假设我们创建了一个名为 action.sh

的 bash 脚本
#!/bin/bash
while true;
do
  read logline
  for substr in 'alt' '\;RING\;'
  do
    if [[ "$logline" = *${substr}* ]]; then
      echo "Got a match"
    fi
  done
done

使脚本可执行,chmod +x action.sh,然后用 nc 启动它,如下所示:

nc -l fritz.box 1012 | ./action.sh

它将无限地监听来自盒子的传入流量,并且应该按照您的意愿行事。我显然没有你的盒子,我通过将它作为 nc -l 127.0.0.1 12000 启动进行测试,然后通过 telnet 127.0.0.1 12000 提供输入,提供你的 RING 样本。好像还行。

$ nc -l 127.0.0.1 12000 | ./action.sh
Got a match
017mobilephonenumber
Got a match
017mobilephonenumber

这样你会更容易接受吗?没有期望(反正我不是期望向导)。

希望这个回答能对您有所帮助。

这是我的简短结论: 要在 FritzBox 上查看传入呼叫,您只需执行: telnet fritz.box 1012 在你的终端。 输出应如下所示:

24.08.15 14:03:05;RING;0;017mobilephonenumber;49304myhomenumber;SIP0;

在我的情况下,我想要执行命令将我的电视静音。 如果有人感兴趣,这里是 instructions 我如何通过 Web/RaspberryPi (Philips Harmony Hub) 控制我的电视。

要在传入呼叫上执行命令,请创建一个名为 action.sh

的脚本
#!/bin/bash
while true;
do
  read logline
  for substr in 'alt' '\;RING\;'
  do
    if [[ "$logline" = *${substr}* ]]; then
      echo "Got a match"
      #here you can put the command you want to execute on an incoming call
    fi
  done
done

创建后使用 chmod +x action.sh 使其可执行 之后,您可以使用 nc 192.168.1.1 1012 | action.sh 启动脚本 这就是您在来电时执行脚本的方式! 特别感谢tgo!!