BashからのSMSまたはZabbixに新しいトリックを教える

この記事は、非常に低予算のバージョンでのSMSアラートの構成に焦点を当てています。
この方法は、家庭またはSOHOでの使用に適しています。 このスキームはこれ以上何もできません。これを覚えておいてください。
Habréの以前には、SMS通知のトピックに関する記事が既にありましたが、すべてローカルUSBモデムまたはemail2smsサービスに帰着しました。
この記事では、異なる相互作用スキームについて説明します。 つまり、Mikrotik機器はGSMゲートウェイとして機能し、Zabbixは端末を介してSMSを送信します。

必要なもの:
1)Mikrotik 951シリーズ(アクティブUSBハブを強く推奨)
2)SIMカード付きUSBモデム
3)デプロイされたZabbixサーバー。

そして、それはすべてRFC2217に従って動作します。

構成全体は3つの段階に分かれています。
A)Mikrotikのセットアップ
B)送信スクリプトの使用
C)Zabbixの設定

Mikrotikの構成


USBモデムがMikrotikに接続され、基本設定とモデムの操作性チェックが行われます。
SMSを送信するためのチャネルをすぐに見つけてください。 私の場合、これは実験的に行われ、チャンネル1と2がこの機能を担っています。

ROSのドキュメントでは、COMポートをTCP経由で転送する機能 (RFC2217)が見つかりました。 通常の端末を使用して、ルーターの背後にある機器にアクセスできます。
Winboxでのセットアップ
システム->ポート->リモートアクセス


すべてのオプションは直感的です。 SMS設定とリモートポートデータチャネルは一致してはいけません!
ネットワーク機器の一部で、構成は終了しました。

SMS送信スクリプト


私の場合、Ubuntu 14.04.2はVMゲストシステムとして機能します。 歴史的に、私たちはそれと共に生きなければなりません。
「鉄」Zabbixと仮想の両方を使用できます。

大量の指示を読むことで、最初にテキスト形式で、次にPDU形式でSMSをBashに送信するスクリプトが送信されました。 PDU形式では、SMSをUnicodeで送信できます。 ラテン文字とキリル文字(この場合は興味があるだけです)。
ここに添付されているスクリプトの最終バージョンでは、任意のコンテンツの「マルチページ」SMSを送信できます。 70文字以上。
侵入したい人のために、リンクをいくつか残します: tyktyk
Bashスクリプト
このスクリプトにはRecodeユーティリティが必要です。
端末からスクリプトを確認する場合は、「echo」から「-e」を削除します。
#!/bin/bash # tel=$1 header=$2 mes=$3 ip=XXX.XXX.XXX.XXX #IP  port=Y #  #  !!!   !!! TP_MR0=0 #  TP-MR IED31=1 #  IED3   UDH #... ########################################################################################################################################### #    #       UDH UDH=`echo $mes | recode ..U2/x2` #    UCS2 UDH=`echo $UDH | sed 's/0x\|,\| //g' | sed 's/000A$//g'` TP_UD=$UDH #TP-UD -   UDH=`echo -n $UDH | wc -c | gawk '{print $1}'` UDH=$(($UDH/4)) #    -      #     tel="$tel"F"" i=`echo -n $tel | wc -c | gawk '{print $1}'` i=$(($i/2)) while [ "$i" != "0" ] do R=`echo $tel | cut --complement -b '3-12' | rev` TPTEL="$TPTEL$R" tel=`echo $tel | cut --complement -b '1-2'` i=$(($i-1)) done ########################################################################################################################################### #  70  ! if [ "$UDH" -le "70" ]; then #      UCS2 TP_UDL=`echo -n $TP_UD | wc -c | gawk '{print $1}'` #       XX TP_UDL=$((($TP_UDL+1)/2)) TP_UDL=`printf '%02x' $TP_UDL | sed 's/[[:lower:]]/\u&/g'` #        #   > TPDU=""0011000B91"$TPTEL"0008AA"$TP_UDL$TP_UD" #    > #   AT+CMGS= Byte=`echo -n $TPDU | cut --complement -b '1-2'` #  2 ,      Byte=`echo -n $Byte | wc -c | gawk '{print $1}'` Byte=$((($Byte)/2)) #    .     RFC2217,  RAW ( sleep 2 echo "AT+CMGF=0" #1 -  , 0 - PDU    !!! sleep 1 echo "AT+CSCS=\"UCS2\"" # sleep 1 echo "AT+CMGS=$Byte" #     sleep 1 echo -e "$TPDU\\032" #   + Ctrl+Z sleep 3 # ,    echo -e "\\033" #ESC   ,        sleep 3 ) | telnet $ip $port #Telnet  ,     exit 0 ################################################################################################################################## #   70! else #  ,    UDH=$((($UDH/67)+1)) # UDH    ( 1 ,     67 ) IED2=$UDH #    -   UDH IED2=`printf '%02x' $IED2 | sed 's/[[:lower:]]/\u&/g'` #    .     RFC2217,  RAW ( sleep 2 echo "AT+CMGF=0" #1 -  , 0 - PDU    !!! sleep 1 echo "AT+CSCS=\"UCS2\"" # sleep 1 #   AT+CMGS= while [ $UDH -ne 0 ]; do #      UCS2 TPUD=`echo -n $TP_UD | cut --complement -b '269-100000000'` #  67      TP_UD=`echo -n $TP_UD | cut --complement -b '1-268'` #   67 ,      TP_MR=`printf '%02x' $TP_MR0 | sed 's/[[:lower:]]/\u&/g'` # TP-MR (00, 01  ..) IED3=`printf '%02x' $IED31 | sed 's/[[:lower:]]/\u&/g'` #   -   UDH UDH_TP_UD=""050003FF"$IED2$IED3$TPUD" #     TP-UDL TP_UDL=`echo -n $UDH_TP_UD | wc -c | gawk '{print $1}'` #      XX TP_UDL=$(($TP_UDL/2)) TP_UDL=`printf '%02x' $TP_UDL | sed 's/[[:lower:]]/\u&/g'` #        TPDU=""0041"$TP_MR"0B91"$TPTEL"0008"$TP_UDL$UDH_TP_UD" #    > TP_MR0=$(($TP_MR0+1)) # $TP-MR0  1    IED31=$(($IED31+1)) #     UDH UDH=$(($UDH-1)) #       #   AT+CMGS= Byte=`echo -n $TPDU | cut --complement -b '1-2'` #  2 ,      Byte=`echo -n $Byte | wc -c | gawk '{print $1}'` Byte=$((($Byte)/2)) #      echo "AT+CMGS=$Byte" #     sleep 1 echo -e "$TPDU\\032" #   + Ctrl+Z sleep 3 # ,    echo -e "\\033" #ESC   ,        sleep 3 done ) | telnet $ip $port #Telnet  ,     fi exit 0 # ,        ,  "-e"  "echo" 


スクリプト内の2つの変数をIPとポートに変更する必要があります。
3つの変数が順番にスクリプトに渡されます:電話番号、ヘッダー(使用されず、Zabbixだけがこのシーケンスでデータをスクリプトに転送します)、メッセージ自体。 さらに、変数をエスケープする必要はありません。Zabbixはそれ自体をエスケープします。
デフォルトでは、スクリプトは次の場所にある必要があります。
バージョン2.2の場合-/ usr / local / share / zabbix / alertscripts
バージョン2.4の場合-/ usr / lib / zabbix / alertscripts。
スクリプトファイルに適切な権限を与えることを忘れないでください!

Zabbixのセットアップ


Zabbix側では、セットアップ手順は簡単ですが、修正のためにもう一度説明します。
1)アラート方法の指定
2)ユーザープロファイルで目的の電話を指定する
電話は11桁の形式で入力されます。 7 **********
3)トリガーされたトリガーのアクションを構成する
ピン留めする写真






「デフォルトテーマ」アクションフィールドはスクリプトで考慮されないことを忘れないでください。したがって、必要なものはすべて「デフォルトメッセージ」に入れてください。 このために次の構成を使用します: {TRIGGER.NAME} {TRIGGER.DESCRIPTION} {ITEM.NAME}-{ITEM.LASTVALUE} 彼女は情報提供以上のものです。

あとがき


記事の冒頭で警告したように、すべては非常に原始的であり、生産には適していません。 しかし、この方法を使用すると、監視システムからもう少し多くの運用情報を非常に控えめなお金で取得できます。 シムのために私は私の休暇を取ることができます。

Source: https://habr.com/ru/post/J264949/


All Articles