如果 telnet 输出包含某些内容,则执行操作

Posted

技术标签:

【中文标题】如果 telnet 输出包含某些内容,则执行操作【英文标题】:If telnet output contains something execute action 【发布时间】: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 会知道答案:-) 【参考方案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!!

【讨论】:

以上是关于如果 telnet 输出包含某些内容,则执行操作的主要内容,如果未能解决你的问题,请参考以下文章

Java/Bukkit (Minecraft) - 如果文件包含玩家名,则检查存储在“:”之后的同一行中的密码并执行某些操作

为什么select()在它之前停止输出?

查找 2 列的空值的过程,如果为真,则使用这些行中的一些值来执行某些操作

如果对象为空,则执行某些操作

如何使用 Alamofire 为每个请求添加 auth 标头,如果响应为 401 则执行某些操作?

如何从 bash 获取 telnet 命令的输出?