2015-08-24 79 views
2

我想在bash中編寫一個小腳本。我的目標是我的FritzBox上的電話會靜音或暫停我的電視。如果telnet輸出包含某些執行操作

我得到通過telnet呼叫的信息(遠程登錄fritz.box 1012)對我的樹莓派,如果有即將到來的電話中我得到這樣的輸出:

15年8月24日14時03分05秒;環; 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會話的輸出到字符串。任何人都可以幫助我?

+0

嘗試從命令行使用你的'telnet'。通常,你必須輸入'quit'或'exit'(etc)來終止會話。你甚至可能不得不使用Ctrl-C(現在不能訪問telnet)。祝你好運。 – shellter

+0

在'bash'中簡單的檢查是'if [[$ string = * $ reqsubstr *]]';然後 – chepner

+0

用'expect'標記此標記,我懷疑@GlennJackman會知道答案:-) –

回答

0

這裏我簡短的結論: 要看到你進來的FritzBox電話,你可以簡單地執行:在你的終端 telnet fritz.box 1012 。 輸出應該看起來像:

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

我我的情況下,我想執行的命令靜音我的電視。 以下是instructions如何通過Web/RaspberryPi(飛利浦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!

0

你有權訪問expect?這意味着這種場景。 man expect是你的朋友,我通過google找到了a fair tutorial。如果你的谷歌爲modem expect,你可以找到這樣的場景的示例腳本(我也可以找到一些FritzBox的,但不知道它是你的盒子)。儘管如此,我還沒有用過它。

+0

這將如何工作?我看到一些腳本,但我理解他們? – Gazura36

+0

我仔細看了一下你的鏈接。我知道你可以在telnet會話中用「expect」來「搜索」。但我不想發送一些東西給FritzBox。如果「預期」成真,我只想運行另一個腳本。 – Gazura36

+0

的確,我錯過了。我是否正確地理解你想要的是永遠監視「telnet」的輸出,並且只要一行符合你的模式,在你的樹莓派上執行命令?如果你確認的話,我會小心一點,我認爲這是可能的。 – 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 

bash腳本使腳本可執行,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

相關問題