SMS経由でサーバーを管理します

それは、昨年夏にグランド付きの棚にバックアップインターネットチャネルを整理するために購入したhuaweiE1550 USBモデムを掘り出したという事実から始まりました。 彼はそれから長く働きませんでした、そして、不必要なように、より良い時まで「バンカー」に移されました。 私が最初にしたことは、MTSを操作するためにロックを解除することでした(歴史的に、この特定のオペレーターを好むようになりました)。 最初は、メールではなくNagiosから警告付きのSMSを送信するというアイデアを思いつきました。 インターネットをすばやく実行した後、私はsmsdデーモンに出会い、smstoolsパッケージからsms-okを送受信しました。 この獣に関するドキュメントを読んだ後、サーバー用のコマンドを使用して、必要な電話からメッセージを受信できるという考えに思いつきました。 したがって、アイデアは「SMSを介したサーバーの管理」から生まれました。これは、サーバーの再起動、電源のオフ、デーモンの再起動、キャッシュのリセット、sshを介したリモート接続用のファイアウォールのポートのオープンなど、あらゆる用途に使用できます。

モデムを構成します


まず、私たちのモデムとLinuxを友達にする必要があります(ちなみに、私はCentos 5.5を使用しています)。 空きusbポートの1つにモデムを接続します。 最初に対処する必要があるのは、モデムがCD-ROMとして定義されていることですが、ご存知のように、SMSメッセージを送信せず、さらには受信しません。 この問題を解決するには、モデムに次のコマンドを送る必要があります: AT ^ U2DIAG = 0 (0-モデムのみ、1-モデム+ cd-rom、255-モデム+ cd-rom +カードリーダー、256-モデム+カードリーダー) Windowsがインストールされているコンピューターがある場合は、ハイパーターミナルを開いてモデムに接続し、コマンドAT ^ U2DIAG = 0を入力して、次の手順をスキップします。

そのため、モデムをLinuxでのCD-ROMではなく、モデムに強制します。 最初にusb_modeswitchおよびminicom yum --enablerepo=rpmforge install usb_modeswitch minicom 、次に/etc/usb-modeswitch.confを作成/編集する必要があります。
DefaultVendor = 0x12d1
DefaultProduct = 0x1446
MessageEndPoint = "0x01"
MessageContent = "55534243000000000000000000000011060000000000000000000000000000"


そして、モデムを別のポートにドロップしますusb_modeswitch秒待つ必要があり(モデムがCD-ROMとして定義される必要があります)、ルートからusb_modeswitchを実行し、以下について確認します。
Looking for target devices ...
No devices in target mode or class found
Looking for default devices ...
Found default devices (1)
Accessing device 004 on bus 007 ...
Using endpoints 0x01 (out) and 0x81 (in)
Inquiring device details; driver will be detached ...
Looking for active driver ...
OK, driver found ("usb-storage")
OK, driver "usb-storage" detached

SCSI inquiry data (for identification)
-------------------------
Vendor String: HUAWEI
Model String: Mass Storage
Revision String: 2.31
-------------------------

USB description data (for identification)
-------------------------
Manufacturer: HUAWEI Technology
Product: HUAWEI Mobile
Serial No.: not provided
-------------------------
Setting up communication with interface 0 ...
Trying to send the message to endpoint 0x01 ...
OK, message successfully sent
Device is gone, skipping any further commands
-> Run lsusb to note any changes. Bye.


新しいttyUSBデバイスが表示されるはずです
ls /dev | grep ttyUSB ls /dev | grep ttyUSB
ttyUSB0
ttyUSB1
ttyUSB2


minicom –sを起動します。/dev/ttyUSB0で動作するようにシリアルポートminicom –s構成します。
設定を終了し、ターミナルが起動したら、コマンドAT ^ U2DIAG = 0を入力し、応答してOKを取得する必要があります。

モデムをモデムに変更する手順は完了しました。smstoolsをインストール/構成します。

Smstools


奇妙なことに、巨大なrpmforgeリポジトリには、smstoolsのような最も有用なパッケージを置く場所がありませんでした。 しかし、それは問題ではありません。インターネットやメーカーのウェブサイトでは十分です。 パッケージ:smstools-3.0.10-4.el5.i386.rpmを見つけて、それをrpm –i smstools-3.0.10-4.el5.i386.rpmで「使用」しました。 smstools、ファイル/etc/sms.confを構成します。
devices = huaweiE1550
logfile = /var/log/smsd.log
loglevel = 2

[huaweiE1550]
device = /dev/ttyUSB0
baudrate = 115200
rtscts = no
init = at+cpms="sm","sm",""
incoming = yes
incoming = high


設定はservice smsd start明確で、デーモンを起動し、 service smsd startしてこの奇跡を確認します: smssend 9128141111 'test message' (キリル文字を理解していない、 UCS-2BEに変換する必要がある、この記事は考慮しない)、携帯電話でSMSメッセージを待つ 切望されたメッセージが来なかった場合、構成にloglevel = 7を入れて、タンバリンに行きます。 すべてが初めて私から生まれました。

smsctrlデーモン


だから私たちは話すことができます、私たちは聞くことを学ばなければなりません!
モデムのSIM番号にSMSを送信すると、しばらくするとsmsdが/var/spool/sms/incoming/huaweiE1550.*に次の内容のファイルを作成します。
From: 79128141111
From_TOA: 91 international, ISDN/telephone
From_SMSC: 79126313431
Sent: 11-03-02 08:05:46
Received: 11-03-02 08:08:09
Subject: huaweiE1550
IMSI: 2500XXXXXXXXXXX
Report: no
Alphabet: ISO
UDH: false

Test message

したがって、サーバーを管理するためのコマンドが存在するかどうか、これらのファイルを確認します。 これを行うには2つの方法があります。bashの最初の小さなデーモン、smsdの2番目の組み込みイベントハンドラーです。

第一の方法

 #!/bin/sh # SMSCtrl # chkconfig: - 55 45 # description: Sms control, Egor N. Zuskin, 2011, http://www.it2k.ru/projects/smsctrl . /etc/rc.d/init.d/functions DAEMON=smsctrl REFRESH_TIME=15 COMMAND_CHAR="#" INCOMING_DIR=/var/spool/sms/incoming ALLOW_PHONES="79128141111 79128141112" SEND_BACK_REPORT=YES to_log(){ text=$1 export LANG=en_EN log_date=`date "+%b %d %H:%M:%S "` log_host=`hostname -s` echo "$log_date $log_host $DAEMON: $text" >> /var/log/$DAEMON.log } start() { echo -n "Starting $DAEMON: " $0 --daemon && success || failure RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/$DAEMON to_log "Starting ..." return $RETVAL } stop() { # Stop daemon. echo -n "Shutting down $DAEMON: " killproc $0 RETVAL=$? to_log "Stopping ..." echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$DAEMON } run() { for File in $(ls $INCOMING_DIR); do Allow=0 for Phone in $ALLOW_PHONES; do cat $INCOMING_DIR/$File | grep "From: $Phone" > /dev/null 2>&1 [ $? -eq 0 ] && Allow=1 done; [ $Allow -eq 0 ] && continue cat $INCOMING_DIR/$File | grep "$COMMAND_CHAR" [ $? -ne 0 ] && continue FromPhone=`cat $INCOMING_DIR/$File | grep "From:" | cut -d " " -f2` command=`cat $INCOMING_DIR/$File | grep "$COMMAND_CHAR" | cut -d "$COMMAND_CHAR" -f2` to_log "Incoming command: $command from $FromPhone" out=`$command` if [ "$SEND_BACK_REPORT" = "YES" ]; then smssend $FromPhone "$out" to_log "Send sms to $FromPhone: $out" fi rm -f $INCOMING_DIR/$File to_log "Deleting file $INCOMING_DIR/$File" done } daemon() { exec >/dev/null exec 2>/dev/null ( trap "" TERM while [ true ]; do run sleep $REFRESH_TIME; done; )& } case "$1" in --daemon) daemon ;; run) run ;; start) start ;; stop) stop ;; restart) $0 stop $0 start exit $? ;; status) status $DAEMON echo ;; *) echo "Usage: $DAEMON {start|stop|restart|status|run}" exit 1 esac exit 0 


COMMAND_CHAR="#" –
INCOMING_DIR=/var/spool/sms/incoming – -
ALLOW_PHONES="79128141111 79128141112" –
SEND_BACK_REPORT=YES – -


あらゆる種類のパスフレーズなどを気にしないために 特定の番号からのコマンドのみを受け入れ(SMSが代替番号からどのように見えるかを確認しませんでした)、ランダムSMSから隔離するためにチームの前に特殊文字の存在を確認することにしました。

デーモンを/etc/init.d/smsctrl、chkconfig chkconfig --add smsctrlservice smsctrl start保存します

第二の方法


/etc/smsd.confに追加します
eventhandler = /root/bin/sms_event.sh
/root/bin/sms_events.shを作成します
 #!/bin/bash COMMAND_CHAR="#" ALLOW_PHONES="79128141111 79128141112" SEND_BACK_REPORT=YES [ "$1" = "RECEIVED" ] || exit 0 to_log(){ text=$1 export LANG=en_EN log_date=`date "+%b %d %H:%M:%S "` log_host=`hostname -s` echo "$log_date $log_host $text" >> /var/log/smsctrl.log } File=$2 Allow=0 for Phone in $ALLOW_PHONES; do cat $File | grep "From: $Phone" > /dev/null 2>&1 [ $? -eq 0 ] && Allow=1 done; [ $Allow -eq 0 ] && exit 0 cat $INCOMING_DIR/$File | grep "$COMMAND_CHAR" [ $? -ne 0 ] && exit 0 FromPhone=`cat $File | grep "From:" | cut -d " " -f2` command=`cat $File | grep "$COMMAND_CHAR" | cut -d "$COMMAND_CHAR" -f2` to_log "Incoming command: $command from $FromPhone" out=`$command` if [ "$SEND_BACK_REPORT" = "YES" ]; then smssend $FromPhone "$out" to_log "Send sms to $FromPhone: $out" fi rm -f $File to_log "Deleting file $File" 


確認する


次の内容のファイル/root/bin/test.shを作成します。
 #!/bin/bash ls –la /etc | grep $1 

次に、電話を取り、テキスト#/root/bin/test.sh smsを含む#/root/bin/test.sh smsを切望の番号に送信し、 tail –f /var/log/smsctrl.logログを調べます。すべてが正常であれば、フォームのSMSが応答で届きます: smsd.conf

おわりに


私はこの解決策を持っています、SMSによって着信接続のためにsshポートを開きます。 これが唯一のアプリケーションではなく、ちょっとした想像力を含んでいると思います。

Huawei E1550およびsmsdのセットアップに役立つリンク
1: SMSTools 3-SMSを送信するためのゲートウェイ
2: Huawei E1550モデムを備えたSMSセンターに関する記事が必要ですか?
3: MTSモデムHuawei E1550を「飼いならす」方法

あなたのコメントを楽しみにしてくれてありがとう。

UPD私の親友の発言によると、私はsmsdを使用してSMSメッセージを処理する実装を追加しました。

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


All Articles