悟懂Linux第26章shell编程-小有意思的脚本③短信服务
第 26章 一些小有意思的脚本
本章内容
发送消息
获取灵感
发送文本
学习编写shell脚本的主要原因在于能够创建自己的Linux系统实用工具。明白如何编写有实用价值的脚本工具很重要。但有时候寓教于乐也是不错的选择。本章中出现的脚本未必实用,但都充满了趣味!这同时也有助于巩固你的脚本编写知识。
26.3 编造借口
永无休止的员工会议充斥着无关紧要的信息。你对此绝对深有体会。与其在那里开会,不如回到办公桌前和有趣的bash shell脚本项目打交道。这里有一个有意思的小脚本,你可以用它逃离下一次员工大会。
短信服务(SMS)允许在手机之间发送文本消息。不过你也能够直接在电子邮件或命令行中使用SMS发送短信。可以使用本节中的脚本编写短信,然后在特定时间把这条短信发送到你的手机上。收到来自你的Linux系统的“重要”信息可算得上是提前离会的绝佳理由。
26.3.1 功能分析
在命令行中发送短信的方法有好几种。其中一种方法是通过系统的电子邮件使用手机运营商的SMS服务。另一种方法是使用curl工具。
1. 学习curl
和wget类似,curl工具允许你从特定的Web服务器中接收数据。与wget不同之处在于,你还可以用它向Web服务器发送数据。而这一点正是我们需要的。
窍门 有些Linux发行版(例如Ubuntu)默认没有安装curl命令。可以输入apt-get install
curl进行安装。你可以在第9章中找到更多关于安装软件包的相关信息。
除了curl工具,你还需要一个能够提供免费SMS消息发送服务的网站。在本节脚本中用到的是http://textbelt.com/text。这个网站允许你每天免费发送最多75条短信。只需要用它发送一条就够了,所以完全没有问题。
窍门 如果你的公司已经有了SMS供应商,例如http://sendhub.com或http://eztexting.com,那你可以在脚本中使用这些站点。注意,要根据SMS供应商的要求修改语法。 要使用curl和http://textbelt.com/text向自己发送短信,需使用下列语法。
$ curl http://textbelt.com/text \ -d number=YourPhoneNumber \
-d "message=Your Text Message"
-d选项告诉curl向网站发送指定的数据。在这里,网站需要特定的数据来发送短信。这些数据包括YourPhoneNumber,即你的手机号码;还包括Your Text Message,即你要发送的短信。
说明 curl能做的远不止向Web服务器发送数据(或从Web服务器接收数据)。它无需用户干预
就能够处理很多其他的网络协议,例如FTP。可以阅读curl的手册页来了解它的强大功能。 发送消息后,如果没有什么问题,网站会给出一条表示发送成功的消息:“success”: true。
$ curl http://textbelt.com/text \ > -d number=3173334444 \
> -d "message=Test from curl"
{
"success": true
}$
$
如果数据(例如手机号)不正确的话,会产生一条错误消息:“success”: false。
$ curl http://textbelt.com/text \
-d number=317AAABBBB \
-d "message=Test from curl"
{
"success": false,
"message": "Invalid phone number." }
$
$
说明 如果你的手机运营商不在美国,http://textbelt.com/text可能没法工作。要是手机运营商在
加拿大的话,你不妨试试http://textbelt.com/Canada。假如是在其他地区的话,可以换用http://textbell.com/intl看看。更多的帮助,请访问http://textbelt.com。
表明发送成功或失败的消息非常有用,不过对脚本来说就没必要了。要删除这些消息,只需将STDOUT重定向到/dev/null(参见第15章)就行了。遗憾的是,curl现在的输出结果无法令人满意。
$ curl http://textbelt.com/text \
> -d number=3173334444 \
> -d "message=Test from curl" > /dev/null
% Total % Received % Xferd Average Speed... Dload Upload... 0 21 0 21 0 45 27 58 ...
$
上面这段经过节选的输出显示了各种统计数据,如果使用curl进行错误排查的话,这些信息将很有用。但是对脚本而言,它们必须被屏蔽掉。好在curl命令有一个-s选项能够满足我们这个需求。
$ curl -s http://textbelt.com/text \
> -d number=3173334444 \
> -d "message=Test from curl" > /dev/null
这就好多了。可以把curl命令放入脚本中了。不过在查看脚本代码之前,有个话题还得讨论一下:通过电子邮件发送短信。
2. 使用电子邮件发送短信
如果不打算使用http://textbelt.com/text提供的短信中继服务,或是出于某些原因,这些服务没法使用,你可以转而使用电子邮件来发送短信。本节简要讲述了如何实现这种方法。
警告 如果你的手机运营商不在美国,这项网络服务可能没法使用。除此之外,你的手机运营
商也许会屏蔽发送自该网站的SMS消息。在这种情况下,你只能尝试使用电子邮件发送。
是否能够使用电子邮件作为替代方案要取决于你的手机运营商。如果运营商使用了SMS网关,那算你运气好。联系你的手机运营商,拿到网关的名字。网关名通常类似于txt.att.net或vtext.com。
窍门 你通常可以使用因特网找出手机运营商的SMS网关。有一个很棒的网站,
http://martinfitzpatrick.name/list-of-email-to-sms-gateways/,上面列出了各种SMS网关以及使用技巧。如果在上面没有找到你的运营商,那就使用搜索引擎搜索吧。
通过电子邮件发送短信的基本语法如下。
mail -s "your text message" your_phone_number@your_sms_gateway
说明 如果mail命令在你的Linux系统上无法使用,就需要安装mailutils包。请阅读本书第9章查
看如何安装软件包。
不幸的是,当你按照语法输入完命令之后,必须输入要发送的短信并按下Ctrl+D才能够发送。这类似于发送普通的电子邮件(参见第24章)。在脚本中显然不适合这样做。可以将电子邮件内容保存在文件中,然后用这个文件来发送短信,具体的做法如下。
$ echo "This is a test" > message.txt $ mail -s "Test from email" \
3173334444@vtext.com < message.txt
现在,发送电子邮件的语法就更适用于脚本了。不过要注意的是,这种方法还存在不少问题。首先,你的系统中必须运行一个邮件服务器(参见第24章)。其次,你的手机服务提供商可能会屏蔽通过电子邮件发送的SMS消息。如果你打算在家里用这个法子的话,这种事经常会发生。
窍门 如果你的手机服务提供商屏蔽了来自系统的SMS消息,可以使用基于云的电子邮件服务
提供商作为SMS中继。使用你惯用的浏览器搜索关键字SMS relay your_favorite_ cloud_email,查看搜索到的网站。
尽管使用电子邮件发送短信可以作为一种备选方案,但这种方法还是问题多多。如果可以的话,免费的SMS中继网站和curl工具要来得容易。在下一节的脚本中,我们使用curl向你的手机发送短信。
26.3.2 创建脚本
实现了相应的功能之后,创建脚本来发送短信就非常简单了。你需要的只是几个变量和curl命令。
脚本中要用到3个变量。如果信息发生了变化,将特定的数据项设置成变量更易于对脚本作出修改,这些变量如下。
#
phone="3173334444"
SMSrelay_url=http://textbelt.com/text text_message="System Code Red"
#
另外需要用到的就是curl工具了。完整的短信发送脚本代码如下。
#!/bin/bash
#
# Send a Text Message
################################
#
# Script Variables ####
#
phone="3173334444"
SMSrelay_url=http://textbelt.com/text text_message="System Code Red"
#
# Send text ###########
#
curl -s $SMSrelay_url -d \
number=$phone \
-d "message=$text_message" > /dev/null
#
exit
如果你觉得这个脚本简单易用,那就对了!更重要的是,这意味着你的shell脚本编程功力已增进不小。就算是简单的脚本也需要测试,在继续之前,先确保使用你的手机号测试了脚本。
窍门 在测试脚本时,要注意网站http://textbelt.com/text不允许你在3分钟之内向同一个手机号码发送三条以上的短信。
要想定时发送短信,必须使用at命令。如果不太记得这个命令的用法,请参见第16章。
首先,可以使用这个新脚本测试一下at命令。在本例中,使用at命令的-f选项以及脚本文件名send_text.sh来运行脚本。如果需要立刻运行的话,使用Now选项。
$ at -f send_text.sh Now
job 22 at 2015-09-24 10:22
$
脚本立刻就开始运行了。不过在你手机接收到短信之前可能需要等待1~2分钟。
要想让脚本在别的时间运行,使用其他的at命令选项(参见第16章)就可以了。在下面的例子中,脚本会在当前时间的25分钟之后运行。
$ at -f send_text.sh Now + 25 minutes job 23 at 2015-09-24 10:48
$
注意,在提交了脚本之后,at命令给出了一条提示信息。信息中给出了日期和时间,指明脚本何时会运行。
真有意思!现在你拥有了一件脚本工具,可以在需要借口离开员工会议的时候助你一臂之力。更妙的是,你还可以修改脚本,让它发送真正需要解决的真正严重的系统故障信息。
26.4 小结
本章展示了如何综合运用本书所讲授的shell脚本编程知识来创建一些有乐趣的shell脚本。每个脚本都巩固了我们先前学到的知识,另外还引入了一些新的命令和思路。
首先演示了如何向Linux系统中的其他用户发送消息。脚本检查了用户是否已经登入系统以及是否允许消息功能。检查完之后,使用write命令发送指定的消息。除此之外,我们还给出了一些脚本的修改建议,这些建议有助于提高你的脚本编写水平。
接下来一节介绍了如何使用wget工具获取网站信息。本节所创建的脚本可以从Web页面中提取格言。检索完毕后,脚本利用一些工具找出实际的格言文本。这些工具包括熟悉的sed、grep、gawk和tee命令。对于这个脚本,我们同样给出了一些修改建议,值得你用心思考,以巩固和提高自己的技能。
本章最后介绍了简单有趣的可以给自己发送短信的脚本。在这一节中我们认识了curl工具的用法以及SMS的概念。尽管这只是个趣味性脚本,但你也可以对其进行修改,用于更严肃的目的。
感谢你加入这场Linux命令与shell脚本编程之旅。希望你能够享受这段旅程,学会如何使用命令行,如何创建shell脚本,提高工作效率。但不要就此停下学习命令行的脚步。在开源世界中,总有一些新东西正在孕育,可能是新的命令行实用工具,也可能是一个全新的shell。不要丢下Linux命令行,也别忘了紧随新的发展和功能。