ADB的run-as和exec-out引數

thinkinwm發表於2020-09-30

https://www.jianshu.com/p/2b10310cd545

 

run-as 可以用某個使用者的許可權來執行命令,這可以解決沒有訪問許可權的問題,在不帶這個引數時執行:

adb push sample.db /data/data/com.sample.foo/databases/sample.db

sample.db就不能被com.sample.foo訪問,因為檔案的使用者和所在的組與com.sample.foo不一致,必須要經過chown修改使用者和組後才能訪問,而且由於每次app安裝後獲得的使用者名稱不一致,沒法將chown命令的引數批處理化,這是個很重要的缺陷。

帶上run-as執行:

adb shell "run-as com.sample.foo sh -c 'cp /sdcard/sample.db /data/data/com.sample.foo/databases/sample.db'"

sample.db就變成com.sample.foo親生的。如果你沒有root許可權,執行pull或者push時又提示Permission denied,不妨加上run-as引數看看。

exec-out是本文的另一個主角。在用adb pull從裝置拉db之類的二進位制檔案的過程中,程式會自作主張的加上一些換行符,最終導致得到的檔案被修改,exec-out的意思是說,給我保留原汁原味,我不要新增劑,謝謝!

你可以對比以下命令的輸出:

adb shell "su -c cat /data/data/com.android.providers.settings/databases/settings.db" > settings.db

adb exec-out "su -c cat /data/data/com.android.providers.settings/databases/settings.db" > settings.db

更詳細的說明請參考adb的幫助和下面的連線:
https://stackoverflow.com/questions/13578416/read-binary-stdout-data-from-adb-shell
https://stackoverflow.com/questions/22703254/copying-files-in-adb-shell-with-run-as/22751947

 

相關文章