2015-08-24 2 views
2

Я пытаюсь написать небольшой скрипт в bash. Моя цель в том, что телефонный звонок на моем FritzBox отключит или приостановит мой телевизор.Если вывод telnet содержит что-то выполнить действие

я получаю информацию о вызове через Telnet (Telnet fritz.box 1012) на моем RaspberryPi и если придет телефонный звонок в я получаю этот выход:

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 

Но я Don `T получить выход моей телнет сессии в строку. Кто может мне помочь?

+0

попробуйте использовать «telnet» из командной строки. Обычно для завершения сеанса вам нужно набрать 'quit' или' exit' (и т. Д.). Возможно, вам даже придется использовать Ctrl-C (теперь у меня нет доступа к telnet). Удачи. – shellter

+0

Более простая проверка в 'bash' есть' if [[$ string = * $ reqsubstr *]] '; затем – chepner

+0

Отметьте это «ожидаем», и я подозреваю, что @GlennJackman узнает ответ :-) –

ответ

0

Вот мой краткий вывод: Чтобы увидеть Incomming вызовы на Fritzbox вы можете просто выполнить: telnet fritz.box 1012 в вашем терминале. Вывод должен выглядеть так:

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

я в моем случае я хочу, чтобы выполнить команду в немых мой телевизор. Вот instructions, как я управляю своим телевизором через Web/RaspberryPi (Philips Harmony Hub), если кто-то заинтересован.

Чтобы выполнить команду по входящему вызову, создайте сценарий под названием action.ш

#!/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 И это, как вы выполнить скрипт на вызов Incomming! Особая благодарность tgo !!

0

У вас есть доступ к expect? Это подразумевается именно для такого рода сценариев. man expect - ваш друг, и я нашел a fair tutorial через google. Если вы google для modem expect, вы можете найти образец сценария для такого сценария (я тоже могу найти его для FritzBox, но не уверен, что это тот же самый ящик, что и ваш). Тем не менее, я не использовал его в возрасте.

+0

Как это работает? Я видел несколько сценариев, но я их понимаю? – Gazura36

+0

Я ближе посмотрел на вашу ссылку. Я понимаю, что вы можете «искать» с «ожиданием» в сеансе telnet. Но я не хочу посылать что-то в FritzBox. Я просто хочу запустить другой скрипт, если «ожидание» стало истинным. – Gazura36

+0

Действительно, я пропустил это. Правильно ли я понимаю, что вы хотите постоянно контролировать вывод «telnet» и всякий раз, когда строка соответствует вашему шаблону, выполните команду на вашем малине pi? Я немного поиграю с этим, если вы подтвердите, я подумал, что это возможно. – tgo

2

После того как вы последний раз прочтете свой вопрос, я думаю, что мы можем пойти на что-то более простое, основанное на nc (netcat).

Пусть предположим, что мы создали скрипт под названием action.sh

#!/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 

Будет ли это более приемлемым для вас? не ожидайте (я все равно не ожидаю мастера).

Я надеюсь, что этот ответ поможет вам больше.

+0

Большое спасибо, что точно то, что я искал ... но если я выполню nc -l fritz.box 1012 | ./action.sh Я получаю nc: Семейство адресов не поддерживается протоколом, поэтому я подумал, что я поставил там ip-адрес, подобный этому nc -l 192.168.1.1 1012 | /home/pi/Desktop/action.sh, но затем я получаю nc: Не могу назначить запрошенный адрес, есть ли у вас идея? – Gazura36

+0

Это потому, что nc пытается создать сокет с портом <1024. Он был показан в качестве примера для тестирования, потому что у меня нет доступа к ящику или сервису, подобному вашему. – tgo

+0

попробуйте без -l – tgo

 Смежные вопросы

  • Нет связанных вопросов^_^