Reputation: 3657
I've been attempting to use adb to pull the sms/mms inbox in its entirety from the device but am having some trouble. The phone is rooted and I've tried the following commands:
Input
./adb pull /data/data/com.android.providers.telephony/databases/mmssms.db
output
Permission denied
Input
./adb pull su /data/data/com.android.providers.telephony/databases/mmssms.db
Output
The help menu
Am I flawed in my thinking that I can pull the sms inbox via commands similar to the ones I've tried? If it can be done what is wrong with my command?
Thanks
Upvotes: 35
Views: 72381
Reputation: 89
You have to give ADB root privalages before you pull that database
adb root
adb pull /data/data/com.android.providers.telephony/databases/mmssms.db ./
Upvotes: 8
Reputation: 2152
Thanks to @Bonlenfum's answer I was able to come up with a reusable script for copying any file/directory on a rooted device to a Windows path (local or UNC).
Edit: Fixed bug with paths containing spaces.
Save the following as: adbSuPull.bat
@echo off
SetLocal
set RemotePath=%~1
set LocalPath=%~f2
if [%1] == [] goto Usage
if "%~1" == "/?" goto Usage
if not [%3] == [] goto Usage
:: Replace " " with "\ " (escape spaces)
set RemotePath=%RemotePath: =\ %
set TimeStamp=%date:~-4,4%-%date:~-10,2%-%date:~-7,2%_%time:~-11,2%-%time:~-8,2%-%time:~-5,2%
:: Replace spaces with zeros
set TimeStamp=%TimeStamp: =0%
if "%LocalPath%" == "" set LocalPath=adbSuPull_%UserName%_%TimeStamp%
set SdCardPath=/mnt/sdcard
set TempPath=%SdCardPath%/adbSuPull_temp_%TimeStamp%/
echo.
echo Copying to temp location "%TempPath%"
echo.
adb shell "su -c 'mkdir -p %TempPath%; cp -RLv %RemotePath% %TempPath%'"
echo.
echo Copying to destination "%LocalPath%"
echo.
adb pull "%TempPath%" "%LocalPath%"
if ErrorLevel 0 goto Cleanup
:Error
echo.
echo Operation failed. Is USB Storage in use?
echo.
pause
call Cleanup
exit /b 1
:Cleanup
echo.
echo Removing temp location "%TempPath%"
echo.
adb shell "rm -Rf '%TempPath%'"
exit /b ErrorLevel
:Usage
echo.
echo.adbSuPull ^<RemotePath^> [^<LocalPath^>]
echo.
echo Copies files/directories from a rooted Android device to a Windows path.
echo Author: Ben Lemmond [email protected]
echo.
echo. RemotePath (required) Specifies the path to the file or directory on
echo. the rooted Android device.
echo.
echo. LocalPath (optional) Specifies the destination path. This can be a
echo. Windows local path (C:\folder) or a UNC path
echo. (\\server\share).
echo. Defaults to adbSuPull_%%UserName%%_%%TimeStamp%%
echo. in the current working directory.
exit /b 1
Usage:
adbSuPull <RemotePath> [<LocalPath>]
Copies files/directories from a rooted Android device to a Windows path.
Author: Ben Lemmond [email protected]
RemotePath (required) Specifies the path to the file or directory on
the rooted Android device.
LocalPath (optional) Specifies the destination path. This can be a
Windows local path (C:\folder) or a UNC path
(\\server\share).
Defaults to adbSuPull_%UserName%_%TimeStamp%
in the current working directory.
Upvotes: 4
Reputation: 20175
One way to fetch contents of the /data directory is to first copy the sqlite db to somewhere that is accessible, and then using adb pull to copy from there to the host.
For example, the following commands use the android bridge to grab the sms data (assuming it is contained in /data/data/com.android.providers.telephony/databases/mmssms.db):
adb shell
$ mkdir /mnt/sdcard/tmp
# su
# cat /data/data/com.android.providers.telephony/databases/mmssms.db > /mnt/sdcard/tmp/mmssms.db
# exit
$ exit
adb pull /mnt/sdcard/tmp/mmssms.db .
Now you have the mms/sms database on your host machine, probe to find most popular recipient, for example:
sqlite3 -header mmssms.db 'select address from sms' | sort -n | uniq -c | sort -n
Finally, tidy up the temp area:
adb shell
$ rm /mnt/sdcard/tmp/mmssms.db
$ rmdir /mnt/sdcard/tmp
$ exit
Upvotes: 47