开门见山吧。
硬件环境:
树莓派2 B+ 一代也可以,但三代的话需要注意串口的针脚位置,因为3代的蓝牙模块使用了二代的串口,新的串口被设置在别的针脚上了。
GSM 800L 一块空白扩展版。接线方式不是本文重点,网上可以查到所有需要的信息。
如果不想这么麻烦也可以使用3G上网卡来代替GSM模块,好处是省去了手工坏处是没办法做的干净利落。
软件环境:
树莓派7 jessie 较老的系统也可以,树莓派8 以上在配合修改ttyAMA0方面与此前的系统可能稍有不同。
gammu gamm-smsd 这两种软件是本文的基础。
先上几张图:
gammu需要进行一定的配置,参考如下:
文件:/etc/gammu-smsdrc
# Configuration file for Gammu SMS Daemon # Gammu library configuration, see gammurc(5) [gammu] # Please configure this! port = /dev/ttyAMA0 model = at connection = at115200 synchronizetime = yes use_locking = yes # Debugging #logformat = textall # SMSD configuration, see gammu-smsdrc(5) [smsd] RunOnReceive = /home/pi/smsrecv.sh MaxRetrise = 10 ReceiveFrequency = 5 PIN = 1234 service = files logfile = syslog # Increase for debugging information debuglevel = 0 # Paths where messages are stored inboxpath = /var/spool/gammu/inbox/ outboxpath = /var/spool/gammu/outbox/ sentsmspath = /var/spool/gammu/sent/ errorsmspath = /var/spool/gammu/error/ |
为了让gammu-smsd能够处理短信需要写一个程序在它收到短信后进行解析和执行。最简单的方法就是写一个脚本,这正是本文准备讲的事。
gammu-smsd的文档里讲了服务会提供的预设变量,本脚本直接写了一个框架用于解析短信,并执行短信的指令。
#!/bin/sh #code xmsg.org #20151015 #20151018 #20151019 1.0 正式版 #20170204 从现在开始它将被修改成一个短信控制系统 ############################################################ #在本次SHELL中我还是学到了不少东西 #一 在if条件中各项内容之间的空格必不可少,不然执行就会出错。 #二 在一个逻辑块中(比如if块)中只有存在错误(比如我在执行脚 # 本时最后少写一个反引号)会引起整个块不被执行。 #三 初始化变量时变量名前一定不能加美元符号,在知道的情况下还 # 是会犯这种错误。 #四 虽然在脚本中使用空格分隔内容可以让内容更清晰,但初始化变 # 量的情况下[变量 等于 数据]这个过程中等于号前号一定不能 # 有空格。 #五 需要eval要小心使用,它在强大的同时可能引起安全问题。 ############################################################ # !ip 获取本机的出口IP # !pt 获取本机开放的端口 # !tcp 获取本机开放的TCP端口 # !ssh 启动SSH # !sshoff 关闭SSH # !rt 重启系统 # !so 清除转发 # !so localport localnetip localnetport 设置内网对外转发 #FULLMSG=$SMS_1_NUMBER #FULLMSG="$FULLMSG"# #手机号需要带国家代码,中国是+86 NUMBER=$SMS_1_NUMBER #UNKNOWN ERROR NOTFOUND="Unknown Error" MASTERPHONE="你的手机号11位别搞错,别不写!" #############短信白名单########################################### #正式版需要有一个白名单这可以减少大量恶意攻击 # ######################################################## #echo FULLMSG >>;/tmp/all.log for i in `seq $SMS_MESSAGES` ; do #echo ---- >>/tmp/all.log varname="SMS_"$i"_TEXT" #echo $varname >>/tmp/all.log smspart=`eval echo '$'$varname` #echo $smspart >>/tmp/all.log FULLMSG="$FULLMSG$smspart" done #echo $FULLMSG >>/tmp/all.log # $NUMBER中存放了手机号码 # $FULLMSG中存了完整短信内容 #echo resend a sms from "$NUMBER" >>/tmp/debug.log #手机号中包含国家代码 if [ "$NUMBER" != "+86$MASTERPHONE" ]; then #一般短信就转发给我自己吧。 echo resend a sms "$FULLMSG".from."$NUMBER" >>/tmp/gate.log `eval "gammu-smsd-inject EMS $MASTERPHONE -unicode -text \"$FULLMSG.from.$NUMBER\""` exit 0 fi if [ "$FULLMSG" = "!ip" ]; then #获取外网IP EVALRET=`curl -k https://xmsg.org/tool/ip.php` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"` exit 0 elif [ "$FULLMSG" = "!pt" ]; then #获取本机端口 EVALRET=`netstat -an|grep "^[tu].p .*0:\*.*"` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"` exit 0 elif [ "$FULLMSG" = "!tcp" ]; then #获取本机端口 EVALRET=`netstat -an|grep "^tcp .*0:\*.*"` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"` exit 0 elif [ "$FULLMSG" = "!ssh" ]; then #启动SSH EVALRET=`sudo service ssh start` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "ssh start"` exit 0 elif [ "$FULLMSG" = "!sshoff" ]; then #关闭SSH EVALRET=`sudo service ssh stop` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "ssh stop"` exit 0 elif [ "$FULLMSG" = "!rt" ]; then #重启本机 sudo reboot exit 0 elif [ "$FULLMSG" = "!so" ]; then #清除转发 sudo killall socat `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "socat killed"` exit 0; elif [ "`expr substr \"$FULLMSG\" 1 3`" = "so " ]; then #设置转发 EVALRET=`eval "sudo /home/pi/bin/$FULLMSG"` #echo "sudo /home/pi/bin/$FULLMSG">>/tmp/a.log `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"` exit 0; else #echo `expr substr "$FULLMSG" 1 3` >>/tmp/a.log #echo "sudo /home/pi/bin/$FULLMSG">>/tmp/a.log EVALRET=`eval "$FULLMSG"` `gammu-smsd-inject EMS $MASTERPHONE -unicode -text "$EVALRET"` echo "$FULLMSG" >> /tmp/gate.log echo "$EVALRET" >> /tmp/gate.log exit 0 fi exit 0 |
这个脚本可以放在/home/pi/smsrecv.sh别忘了给它执行权:
chmod 755 /home/pi/smsrecv.sh
如果要执行高权限操作比如,重启服务,打开小于1024的端口,杀掉进程。那么需要给gammu帐号一个无密码使用sodu的权限。
打开/etc/soduers
添加以下内容
gammu ALL=(ALL) NOPASSWD: ALL
到文件末尾
上面脚本中so指令需要以下支持
apt-get install socat
创建文件/home/pi/bin/so
#!/bin/sh if [ $# -eq 3 ]; then RET=`/usr/bin/socat TCP4-LISTEN:$1,reuseaddr,fork TCP4:$2:$3 >/dev/null 2>&1 &` echo "$2:$3->$1" elif [ $# -eq 2 ]; then RET=`/usr/bin/socat TCP4-LISTEN:$1,reuseaddr,fork TCP4:$2:$1 >/dev/null 2>&1 &` echo "$2:$1->$1" else echo args error fi |
chmod 755 /home/pi/bin/so