前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用libimobiledevice + ifuse提取iOS沙盒文件

使用libimobiledevice + ifuse提取iOS沙盒文件

作者头像
周希
发布于 2019-10-15 06:35:29
发布于 2019-10-15 06:35:29
3.4K00
代码可运行
举报
文章被收录于专栏:APP自动化测试APP自动化测试
运行总次数:0
代码可运行

简介

libimobiledevice:一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备。

Git仓库: https://github.com/libimobiledevice/libimobiledevice.git

ifuse: 也是一个开源包,可以用来访问iDevice的工具

Git仓库: https://github.com/libimobiledevice/ifuse.git

我们可以利用libimobiledevice与ifuse进行shell封装,辅助实现自动化的测试过程。

这里我们用来提取iOS设备上APP沙盒中的日志文件

快速直接安装libmobiledevice的方法

MacOS上安装libimobiledevice

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo brew update
sudo brew install libimobiledevice
#libimobiledevice中并不包含ipa的安装命令,所以还需要安装
sudo brew install ideviceinstaller

Ubuntu下安装libimobiledevice

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo add-apt-repository ppa:pmcenery/ppa
sudo apt-get update
apt-get install libimobiledevice-utils
sudo apt-get install ideviceinstaller

常用功能

1. 获取设备已安装app的bundleID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinstaller -l

演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:/ jackey$ ideviceinstaller -l
Total: 13 apps
com.zhouxi.xiaoailiteios - 小米同学 20
com.apple.test.WebDriverAgentRunner-Runner - WebDriverAgentRunner-Runner 1
com.apple.store.Jolly - Apple Store 5.0.0.0302
com.apple.clips - 可立拍 4141.1.91
com.apple.mobilegarageband - 库乐队 4878.17
com.apple.Keynote - Keynote 讲演 5625
com.apple.Numbers - Numbers 表格 5625
com.apple.Pages - Pages 文稿 5625
com.apple.iMovie - iMovie 3709.9.72
com.apple.itunesu - iTunes U 2360
com.sogou.sogouinput - 搜狗输入法 148198
com.tencent.xin - 微信 6.7.4.44
com.ss.iphone.ugc.AwemeInhouse - 抖音短视频内测 43006
Jackeys-MacBook-Pro:/ jackey$ 

2. 安装ipa包,卸载应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//命令安装一个ipa文件到手机上,如果是企业签名的,非越狱机器也可以直接安装了。
ideviceinstaller -i xxx.ipa

//命令卸载应用,需要知道此应用的bundleID
ideviceinstaller -U [bundleID]

卸载演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:/ jackey$ ideviceinstaller -U com.zhouxi.xiaoailiteios
Uninstalling 'com.zhouxi.xiaoailiteios'
 - RemovingApplication (50%)
 - GeneratingApplicationMap (90%)
 - Complete
Jackeys-MacBook-Pro:/ jackey$ 

安装演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:Code jackey$ ideviceinstaller -i QQ音乐\ 8.9.7.ipa 
Copying 'QQ音乐 8.9.7.ipa' to device... DONE.
Installing 'com.tencent.QQMusic'
 - CreatingStagingDirectory (5%)
 - ExtractingPackage (15%)
 - InspectingPackage (20%)
 - TakingInstallLock (20%)
 - PreflightingApplication (30%)
 - VerifyingApplication (40%)
 - CreatingContainer (50%)
 - InstallingApplication (60%)
 - PostflightingApplication (70%)
 - SandboxingApplication (80%)
 - GeneratingApplicationMap (90%)
 - Complete
Jackeys-MacBook-Pro:Code jackey$ 

这里补充一个: ipa我们可以通过itunes来进行下载, 下载完后可以在iTunnes偏好设置中看到存放目录

如果连接了多部手机需要分别安装时,请使用UDID指定:ideviceinstaller -u udid -i *.ipa

3. 查看系统日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicesyslog

4. 查看当前已连接的设备的UUID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevice_id --list

5. 截图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicescreenshot

6. 查看设备信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinfo

7. 获取设备时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicedate

8. 设置代理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
iproxy

9. 获取设备名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicename

10. 查看和操作设备的描述文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceprovision list

11. 挂载DeveloperDiskImage,用于调试(这个在我的机器上面不能用, 应该是缺少什么东西了)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceimagemounter

12. 调试程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicedebug

如果在运行上面指令出现以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"Could not connect to lockdownd. Exiting."

使用以下方式重新安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew uninstall ideviceinstaller
brew uninstall libimobiledevice
brew install --HEAD libimobiledevice
brew link --overwrite libimobiledevice
brew install ideviceinstaller
brew link --overwrite ideviceinstaller

重新安装过程中如果出现以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A recent change to libimobiledevice bumped the constraint on libusbmuxd to >= version 1.1.0. The current usbmuxd homebrew package is version 1.0.10.
As a result, homebrew --HEAD installs of libimobiledevice no longer build without a --HEAD install of usbmuxd.

使用以下指令升级usbmuxd:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew update
brew uninstall --ignore-dependencies usbmuxd
brew install --HEAD usbmuxd
brew link --overwrite usbmuxd

升级后接着安装libimobiledevice

挂载文件系统工具:ifuse

安装方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew cask install osxfuse
brew install ifuse

或者通过官网安装

https://osxfuse.github.io

1. 安装好后使用ifuse -h会打印详细使用说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Usage: ifuse MOUNTPOINT [OPTIONS]
Mount directories of an iOS device locally using fuse.

  -o opt,[opt...]    mount options
  -u, --udid UDID    mount specific device by its 40-digit device UDID
  -h, --help        print usage information
  -V, --version        print version
  -d, --debug        enable libimobiledevice communication debugging
  --documents APPID    mount 'Documents' folder of app identified by APPID
  --container APPID    mount sandbox root of an app identified by APPID
  --root        mount root file system (jailbroken device required)

Example:

  $ ifuse /media/iPhone --root

  This mounts the root filesystem of the first attached device on
  this computer in the directory /media/iPhone.

Jackeys-MacBook-Pro:Code jackey$ 

2. 挂在媒体文件目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//注意,此处的挂载点必须要真实存在,需要预先创建好目录,否则挂载失败

ifuse [挂载点]

演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo mkdir /myapp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:/ jackey$ sudo ifuse myapp/
Password:
Jackeys-MacBook-Pro:/ jackey$

卸载挂载点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fusermount -u [挂载点]

这个指令在我的电脑上不行, 我改用的sudo umount /myapp

3. 挂载某个应用的documents目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifuse --documents [要挂载的应用的bundleID] [挂载点]

//注意,iOS 8.3之后要求应用的UIFileSharingEnabled权限要开启,否则可能没有权限访问,会有如下的错误提示

ERROR: InstallationLookupFailed
The App 'com.wsgh.test' is either not present on the device, or the 'UIFileSharingEnabled' key is not set in its Info.plist. Starting with iOS 8.3 this key is mandatory to allow access to an app's Documents folder.

演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:/ jackey$ sudo ifuse --documents com.zhouxi.xiaoailiteios /myapp
Password:
ERROR: InstallationLookupFailed
Jackeys-MacBook-Pro:/ jackey$ 

报这个错是因为我们app没有开启文件共享,需要在app的info.plist添加一下字段

我们再试试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:/ jackey$ sudo ifuse --documents com.zhouxi.xiaoailiteios /myapp
Password:
mount_osxfuse: mount point /myapp is itself on a OSXFUSE volume

这里报错的原因是我们不能把文件挂在到根目录, 我们先删除之前的挂载

重新挂在到Document目录下我们自己的文件夹中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifuse --documents com.zhouxi.xiaoailiteios /Users/jackey/Documents/Xiaomi/myapp

OK, 这次没有出错, 打开Finder进入所在目录发现myapp文件夹没有了, 但增加了一个OSXFUSE Volume的目录

打开里面就是我们的Documents目录

使用umount可卸载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
umount /Users/jackey/Documents/Xiaomi/myapp

4. 挂在某应用的整个沙盒目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifuse --container [要挂载的应用的bundleID] [挂载点]

演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifuse --container com.zhouxi.xiaoailiteios /Users/jackey/Documents/Xiaomi/myapp/xiaoailite

打开finder可以看到整个沙盒目录都挂在上来了

如果需要自动提取沙盒日志,这里我们可以写脚本使用挂在的目录去获取里面的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Jackeys-MacBook-Pro:xiaoailite jackey$ pwd
/Users/jackey/Documents/Xiaomi/myapp/xiaoailite
Jackeys-MacBook-Pro:xiaoailite jackey$ ls
Documents    Library        SystemData    tmp
Jackeys-MacBook-Pro:xiaoailite jackey$ 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
上一篇文章:Scrapy源码剖析(三)Scrapy有哪些核心组件?我们已经分析了 Scrapy 核心组件的主要职责,以及它们在初始化时都完成了哪些工作。
_Kaito
2021/03/23
1.2K0
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
爬虫框架scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
菲宇
2019/06/12
1.8K0
爬虫框架scrapy
Scrapy源码剖析(三)Scrapy有哪些核心组件?
在上一篇文章:Scrapy源码剖析(二)Scrapy是如何运行起来的?我们主要剖析了 Scrapy 是如何运行起来的核心逻辑,也就是在真正执行抓取任务之前,Scrapy 都做了哪些工作。
_Kaito
2021/03/23
5710
Scrapy源码剖析(三)Scrapy有哪些核心组件?
Scrapy爬虫框架
网络爬虫框架scrapy (配置型爬虫) 什么是爬虫框架? 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 爬虫框架是个半成品,帮助用户实现专业网络爬虫 scrapy框架结构(“5+2”结构) image.png spider: 解析downloader返回的响应(Response) 产生爬取项(scraped item) 产生额外的爬去请求(Request) 需要用户编写配置代码 engine(引擎): 控制所有模块之间的数据流 根据条件触发事件 不需要用户修改 scheduler(调度器): 对
Cloud-Cloudys
2020/07/07
9930
Python自动化开发学习-Scrapy
讲师博客:https://www.cnblogs.com/wupeiqi/p/6229292.html 中文资料(有示例参考):http://www.scrapyd.cn/doc/
py3study
2020/01/08
1.5K0
Python 爬虫(六):Scrapy 爬取景区信息
Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘、监测和自动化测试。安装使用终端命令 pip install Scrapy 即可。
Python小二
2020/08/18
8290
Python 爬虫(六):Scrapy 爬取景区信息
python爬虫----(scrapy框架提高(1),自定义Request爬取)
最近看scrappy0.24官方文档看的正心烦的时候,意外发现中文翻译0.24文档,简直是福利呀~ http://scrapy-chs.readthedocs.org/zh_CN/0.24/
lpe234
2020/07/27
7910
爬虫之scrapy框架(二)
当我们启动spider.py文件时,会执行我们设置好的start_urls,但是源码真正是如何处理的呢?我们进入scrapy.Spider查看源码,Spider类下有如下代码:
GH
2020/03/19
9600
[爬虫]scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
周小董
2019/03/25
1.2K0
[爬虫]scrapy框架
Python scrapy 安装与开发
Scrapy是采用Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取采集web站点信息并从页面中提取结构化的数据。
阳光岛主
2019/02/18
1.3K0
Python scrapy 安装与开发
Scrapy源码剖析(二)Scrapy是如何运行起来的?
在上篇文章:Scrapy源码剖析(一)架构概览,我们主要从整体上了解了 Scrapy 的架构和数据流转,并没有深入分析每个模块。从这篇文章开始,我将带你详细剖析 Scrapy 的运行原理。
_Kaito
2021/03/23
1.1K0
Scrapy源码剖析(二)Scrapy是如何运行起来的?
【源码解读】如何充分发挥 Scrapy 的异步能力
但是,在日常工作和面试过程中,经常发现有些同学会笃定地认为 Scrapy 采用的是多线程并发模型。实际上,虽然 Twisted 框架提供了线程池支持,但是其核心网络部分处理逻辑依赖的是「单线程 IO 多路复用」技术,在 Linux 平台上,是围绕 epoll() 系统调用实现的 Reactor 模式。
小歪
2019/05/13
3.6K0
【源码解读】如何充分发挥 Scrapy 的异步能力
爬虫之scrapy框架(一)
Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
GH
2020/03/19
8360
独家 | 手把手教你用scrapy制作一个小程序 !(附代码)
本文提供了scrapy和pycharm安装和配置时容易出现错误和解决办法,同时演绎了网络教程经典的“爬取豆瓣9分书单”的例子,每一步代码都给出了编者的理解,并对可能出现的错误给出了解决方案,操作性强。 一. 前言 Scrapy是用于Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 有爬虫爱好者认为scrapy的优点是自定义程度高,适合学习研究爬虫技术,要学习的相关知识也较多,故而完成一个
数据派THU
2018/01/30
2.1K0
独家 | 手把手教你用scrapy制作一个小程序 !(附代码)
Scrapy源码解读
Scrapy一个比较完整的爬虫框架,包含了爬取任务的调度、多个线程同时爬取(异步多线程,不用等一个请求完成后才开始另一个请求)、自动过滤重复的链接等功能。使用者通过定义比较简单的爬虫类(例如目标网址、爬取的具体页面元素、存储的格式字段、数据清理逻辑),剩余的就可以交给scrapy完成爬取工作。
大数据技术架构
2023/03/08
8490
Scrapy源码解读
scrapy框架的介绍
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
用户2337871
2019/07/19
6300
scrapy框架的介绍
Scrapy 入门教程
爬虫就是Scrapy用来从网站抓取数据的类,它们都继承于scrapy.Spider类。
Stanley Sun
2019/09/23
8070
收藏| Scrapy框架各组件详细设置
大家好,关于Requests爬虫我们已经讲了很多。今天我们就说一下Scrapy框架各组件的详细设置方便之后更新Scrapy爬虫实战案例。
刘早起
2020/05/14
7380
18.scrapy_maitian
ershoufang.py # -*- coding: utf-8 -*- import scrapy class ErshoufangSpider(scrapy.Spider): name = 'ershoufang' allowed_domains = ['maitian.com'] start_urls = ['http://maitian.com/'] def parse(self, response): pass zufang_spider.py
hankleo
2020/09/17
2870
Python爬虫之scrapy框架
里面的parse方法,这个方法有两个作用 1.负责解析start_url下载的Response 对象,根据item提取数据(解析item数据的前提是parse里全部requests请求都被加入了爬取队列) 2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request 对象 这两点简单来说就是编写爬虫的主要部分
yuanshuai
2022/08/22
3340
Python爬虫之scrapy框架
相关推荐
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档