如果 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!!
我正在尝试在 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!!