由于工作中的自动化测试任务需要在现网执行,从安全的角度考虑,短信验证的部分不可能再使用测试环境内的大权限方式绕过了,况且短信验证功能也是需要测试的关键业务之一,所以从网上搜索并总结了一份从测试机里取出短信的方法。下面开始详述取出短信方法,脚本部分是ruby
编写,比较重要的部分在于命令行和 adb 交互与短信数据文件的解析,所以换其它语言应该也是很简单的。
获取权限的方法,百度上有很多种,需要这样做的原因是短信文件在系统目录的/data/data/com.android.providers.telephony/databases
下,需要 root 权限才能访问。
安装过程参考,从命令行使用 adb 获取短信数据库的相应指令如下:
1.adb shell
2.su root
3.cd /data/data/com.android.providers.telephony/databases
(查看是否 root 成功,还有短信文件 mmssms.db 是否在这个目录下)
4.cp /data/data/com.android.providers.telephony/databases/mmssms.db /sdcard
(复制短信文件到 sdcard 目录下,在这个目录下就可以通过 adb 的 pull 命令直接拉取到本机上了)
5.exit
(退出 adb shell)
6.adb pull /sdcard/mmssms.db
(命令行运行,复制到当前目录,接下来需要做的就是解析这个数据文件了)
短信数据库是SQLite
的格式,解析需要安装SQLite
的客户端,详情参考SQLite 的安装
require 'open3'#命令行交互
require 'sqlite3'#sqlite
#获取adb的root权限,将短信文件复制sdcrad的文件夹,这样就可以通过adb的命令把文件拉取到本地
Open3.popen3('adb shell') do |stdin, stdout, stderr, wthr|
stdin.write "su root\n"
stdin.write "cp /data/data/com.android.providers.telephony/databases/mmssms.db /sdcard\n"
stdin.write "exit\n"
stdin.write "exit\n"
stdin.close
stdout.each_line { |line| puts line }
stdout.close
end
#adb的pull命令把文件拉取到本地
system("adb pull /sdcard/mmssms.db")
#查询短信数据文件,表名是sms
db=SQLite3::Database.new("mmssms.db")
sms_array=Array.new
db.execute("select t.* from sms t order by _id") do |row|
p row
sms_array<<row[12]
end
db.close
sms_array.each do |sms|
#打印详细内容
puts sms
end
接下来按照自己的需求去解析需要的字符串就好了。
吾即大灾变!!!