sh
ログ出力を受け取るスクリプトがあります。特定の条件でIPアドレスを見つけた場合は、そのcurl
IPアドレスに要求を送信する必要があります(重要な場合は、受信者はPolycom VoIP電話です)。
受信機から以下を取得します。
PushParserC::parseDoc: Expecting <PolycomIPPhone>: $'<PolycomIPPhone><Data
正しい行は次のような結果を生成します。
wappPushHandlerC::Handle: <PolycomIPPhone><Data priority="Critical">Key:Setup
-v
ダンプでは、私はcurl
次のようになります。
curl: (6) Could not resolve host: priority="Critical">Key....
<はIPアドレスでなければなりません。
どちらの場合も、スクリプトの空白が切り捨てられたようです。ほとんどのソリューションはスペースを削除しますが、これは意図したXHTMLを破損します。
私のスクリプトは次のとおりです
#!/bin/sh
tail -0f /var/log/somelogfile.log | while read line
do
if echo $line | grep "\[WARNING\]" | grep -q "SIP auth failure" ; then
# Log detected sip authentication error to file
STR="$(echo $line | awk '{print "Date:",$1,"Time:",$2,"Login:",$14,"IP:",$17}')" >> logger.txt
# Get the found private IP address out of the errored line
IP="$(echo $STR | rev | cut -d" " -f1 | rev)"
# Provide output to the user of the IP to brute
echo "Target IP: " $IP
# Content Type header
CT="Content-Type: application/x-com-polycom-spipx"
# The XHTML to send to the phone in question for forced factory reset
XHTML="curl -v --digest -u Push:Push -d $'<PolycomIPPhone><Data priority=\"Critical\">Key:Setup\nKey:Dialpad2\nKey:Dialpad9\nKey:Dialpad9\nKey:Dialpad9\nKey:Softkey4\nKey:Dialpad1\nKey:Dialpad5\nKey:Dialpad5</Data></PolycomIPPhone>' --header \"$CT\" $IP/push"
# print out URL for test
echo $XHTML
RESPONSE=`$XHTML`
echo
echo $RESPONSE
fi
done
# This is an example of the fuctional code that works straight in the terminal.
# curl --digest -u Push:Push -d $'<PolycomIPPhone><Data priority="Critical">Key:Setup\nKey:Dialpad2\nKey:Dialpad9\nKey:Dialpad9\nKey:Dialpad9\nKey:Softkey4\nKey:Dialpad1\nKey:Dialpad5\nKey:Dialpad5</Data></PolycomIPPhone>' --header "Content-Type: application/x-com-polycom-spipx" xx.xx.xx.xx/push && echo
他のソリューションはスペースを削除するか、この文脈では不可能なエンコードを実行します。しかし、このアプリではこれらのどれも動作しません!
ありがとうございます!
答え1
選択のために-d
頑張ります
echo '$<PolycomIPPhone><Data priority=\"Critical\">....' | curl -d@- (other options)
~によるとman curl
文字@でデータを開始する場合、残りはデータを読み取るファイル名でなければなりません。または - カールを使用してstdinからデータを読み取る場合は、次のようにします。
答え2
@Archemarと@dave_thompson_085の助けを借りて、動作するソリューションを策定することができました。
送受信時に空白と改行の問題を解決するために、上記と「実際の」改行を含むファイルを作成しました。コンテンツを「フォーム」に送信すると、フォーマットがそのまま残ることがわかるまで、新しいファイルをカールにパイプすると、同じ問題が発生しました。
このような問題が自動化された方法で解決されるのを見るのは本当に素晴らしいことです。
みんなもう一度ありがとう
#!/bin/bash
# Sends a data file to the phone using curl
tail -0f /var/log/freeswitch/freeswitch.log | while read line
do
if [[ $line == *\[WARNING\]* && $line == *SIP\ auth\ failure* ]] ; then
STR="$(echo $line | awk '{print "Date:",$1,"Time:",$2,"IP:",$17,"Login:",$14}')" # Pull important lines from log
IP="${line##* }" # Store private IP address of failed auth
CT="Content-Type: application/x-com-polycom-spipx" # Content Type header
OCCUR=`grep "$IP" logger.txt | wc -l` # Count of how many failed attempts to auth
# Provide output to the terminal
echo -n "TargetIP:" $IP
# If there are less than 6 attemps at authenticating, send commands to phone
if [ $OCCUR -le 5 ] ; then
echo " Formatting with" $OCCUR "previous attepts."
# Log the parsed string from the log with attempt status
echo "Status: FORMAT" $STR >> logger.txt
# Send user a HTML warning screen
curl -s --digest -u push:push -d "<PolycomIPPhone><Data priority='"critical"'><h1> PHONE WILL UPDATE </h1>Please do not interact with the phone. It will now format and restart. Contact IT support for any concerns</Data></PolycomIPPhone>" --header $CT $IP/push > /dev/null
# Allow for user read time
sleep 8
# Send instruction set phone in question for forced factory reset
curl -s --digest -u push:push --form "[email protected]" --header "$CT" $IP/push > /dev/null
# If there are 6 failed attempts, log to file for further action
elif [ $OCCUR -eq 6 ] ; then
echo " Too many attempts. Logging..."
echo "Status: FAILED" $STR >> logger.txt
# Beyond 6 attemps, no action will be taken
else
echo " IGNORED"
fi
fi
done