【问题标题】:If telnet output contains something execute action如果 telnet 输出包含某些内容,则执行操作
【发布时间】:2015-11-18 06:28:44
【问题描述】:

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

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

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 会话的输出放入字符串中。谁能帮帮我?

【问题讨论】:

  • 尝试从命令行使用您的telnet。通常,您必须键入quitexit(等)来终止会话。您甚至可能必须使用 Ctrl-C(现在无法访问 telnet)。祝你好运。
  • bash 更简单的签入是if [[ $string = *$reqsubstr* ]];那么
  • expect 标记这个,我怀疑@GlennJackman 会知道答案:-)

标签: bash telnet


【解决方案1】:

在您最近发表评论并再次阅读您的问题后,我认为我们可以根据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

这对你来说更容易接受吗?没有期望(无论如何我不是期望向导)。

希望这个回答对你有更多帮助。

【讨论】:

  • 非常感谢,这正是我想要的……但如果我执行 nc -l fritz.box 1012 | ./action.sh 命令我得到 nc: Address family not supported by protocol 所以我想我把 IP 地址放在那里 nc -l 192.168.1.1 1012 | /home/pi/Desktop/action.sh 但后来我得到了 nc:无法分配请求的地址你有想法吗?
  • 这是因为 nc 试图创建一个端口小于 1024 的套接字。它被显示为测试示例,因为我无法访问像你这样的盒子或服务。
  • 完美,非常感谢!我会写一个简短的结论。
【解决方案2】:

您可以访问expect 吗?它正是针对这种情况的。 man expect 是你的朋友,我通过谷歌找到了a fair tutorial。如果你用谷歌搜索modem expect,你可以找到这种场景的示例脚本(我也可以为 FritzBox 找到一些,但不确定它和你的盒子是同一个盒子)。不过,我已经很久没有使用它了。

【讨论】:

  • 这将如何工作?我看到了一些脚本,但我理解它们?
  • 我仔细查看了您的链接。我了解您可以在 telnet 会话中使用“expect”“搜索”。但我不想向 FritzBox 发送一些东西。如果“期望”变为真,我只想运行另一个脚本。
  • 确实,我错过了。我是否正确理解您想要永久监视telnet 的输出,并且只要一行与您的模式匹配,就在您的树莓派上执行命令?如果您确认,我会稍微摆弄一下,我认为这是可能的。
  • 啊!太好了,我很高兴。我希望它真的对你有用。
【解决方案3】:

这是我的简短结论: 要查看 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!!

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2019-07-18
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2013-01-20
    • 2023-04-06
    相关资源
    最近更新 更多