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 smsctrl



service 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メッセージを処理する実装を追加しました。



All Articles