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 > dest
adb shell "cat source > dest"
adb shell run-as "cat source > dest"
adb shell "run-as cat source \> dest"
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.