Copying files in ADB shell with run-as

前端 未结 3 927
予麋鹿
予麋鹿 2020-12-01 16:57

Is there a way to write a script that will copy files from an ADB shell using run-as?

The only way I know of to copy in the adb shell is using cat source >

相关标签:
3条回答
  • 2020-12-01 17:22

    Following Chris Stratton's advice, the way I eventually got this to work was as follows (for copying shared preferences back to the device):

    adb push shared_prefs.xml /sdcard/temp_prefs.xml
    cat <<EOF | adb shell
    run-as com.example.app
    cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml
    exit
    exit
    EOF
    

    Piping directly to adb shell run-as did not work, and I do not know why, but piping to adb shell does. The trick is to then call run-as from the interactive shell, and it continues to accept input from the pipe.

    The HERE doc lets me easily embed the newlines to separate commands and in general just makes it readable; I did not have much luck with semicolons, but that might have been because of the way I was doing things. I believe it might work with other methods of piping multiple commands/newlines; I stopped the experiment once I finally got it to work.

    The two exits are necessary to prevent a hanging shell (killable with CTRL-C); one for run-as, and the other for adb shell itself. Adb's shell doesn't respond to end-of-file very nicely, it seems.

    0 讨论(0)
  • 2020-12-01 17:44

    The OP tried to combine the following 3 commands (that he had no problem executing one after another in the interactive shell session) into a single non-interactive command:

    adb shell
    run-as com.example.app
    cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
    

    For simplicity let's start from within an interactive adb shell session. If we just try to combine the last two commands into a single line:

    run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
    

    This would not work because of how shell redirection works - only the cat /sdcard/temp_prefs.xml part of the command would be run with com.example.app UID

    Many people "know" to put the part of the command around redirection into quotes:

    run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
    

    This does not work because the run-as command is not smart enough to parse the whole command. It expects an executable as the next parameter. The proper way to do it would be to use sh instead:

    run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
    

    So can we just prepend adb shell to the command and be done with it? Not necessarily. By running the command from your PC you also add another local shell and its parser. Specific escape requirements would depend on your OS. In Linux or OSX (if your command does not already contain any ') it is easy to single-quote the whole command like so:

    adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'
    

    But sometimes it is just easier to use an alternative solutions with (-out or less) quotes:

    adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml
    

    Or if your device does not have the cp command:

    adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml
    

    Also notice how I used shared_prefs/com.example.app_preferences.xml instead of full /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml - normally inside of run-as command your current directory is the HOME dir of your package.

    0 讨论(0)
  • 2020-12-01 17:44

    you could just change the permission of the directory and then pull all the files out. but for me i was looking for just one shared preference file and i was able to get the data like this:

    PACKAGE='com.mypackage.cool'
    SHAREDPREF_FILE="${PACKAGE}_preferences.xml"
    
        adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE
    

    now we have the data of the sharedpreference file stored in a file of the same name.

    0 讨论(0)
提交回复
热议问题