如果 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
。通常,您必须键入quit
或exit
(等)来终止会话。您甚至可能必须使用 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) - 如果文件包含玩家名,则检查存储在“:”之后的同一行中的密码并执行某些操作
查找 2 列的空值的过程,如果为真,则使用这些行中的一些值来执行某些操作