今天把玩手頭的那部Android手機時碰到一個問題,即因為權限問題無法將文件復制到/system/和/data/分區中,經過一番折騰后,算是解決了,在此記錄一筆。本方所涉及到的命令輸入,均用斜體字表示。
情況是這樣的:該台Android手機不提供adb root的權限,但又不能裝破解root權限的軟件,若要往Android手機的/system/和/data/分區下拷一些文件, 是否有其它方法可以將文件復制到上述的分區中? 當然,手機里的文件管理器沒有提供將文件從存儲卡上復制到這兩個分區的功能,如果有哪個Android文件管理器提供類似的功能,在此也因為不能下載安裝而做罷。
幸好,發現手機有預留方法可以使/system和/data分區獲得寫權限,而且也可以在adb shell里執行su命令以切換用戶。能執行的su加上可寫的分區,意味着該分區的殺剮均在我們的掌控之下了(如對手機內置的運營商定制軟件不滿,那就殺之……)。廢話少說,假如要將test.mp3文件拷貝到/system/media/audio/目錄下,可以按如下步驟執行:
1. 將目標文件test.mp3復制到存儲卡上, /sdcard/test.mp3;
2. 打開PC機上的命令行,輸入adb shell並按回車進入Android系統命令行模式;
3. 輸入cd system/media/audio並回車;
4. 輸入cat /sdcard/test.mp3 > test.mp3並回車。
當第4步完成后,在命令行下輸入命令ls應該就能看到test.mp3文件了。當然,步驟3也可省略,在adb shell里,直接敲入命令 cat /sdcard/test.mp3 >/system/media/audio/test.mp3效果也是一樣的。
因為Andorid命令行里沒有cp命令(我一直未能明白為何不將該命令集成進去?),但是有mv這一條命令,那為什么不直接輸入mv /sdcard/test.mp3 /system/meida/audio/test.mp3呢?好,那我們試一下該命令,得到答復是:“failed on '/sdcard/test.mp3' - Cross-device link”, 也就是說mv命令不允許將存儲卡中的文件復制到/system/或/data/分區中,因為兩者被認為是在不同的設備上。所以步驟4采用cat命令,查一下cat的用法:cat [選項]... [文件]... ,其作用是將[文件]或標准輸入組合輸出到標准輸出。平常工作時偶爾會用到cat命令去顯示文本文件的內容,然后又想到了重定向符'>',所以兩者一結合,就自然則然地想到是否可以通過將cat的文件輸出到指定位置來代替cp的功能?通過嘗試發現確實可以,不過我不清楚Linux系統下cp命令的實現細節,回頭去查一下看。前已敘及有了su命令及可寫的分區,基本可以為所欲為了,所以曲線將文件復制到/system/或/data/分區后,如果文件權限/用戶名/組不符合,就可以通過chmod和chown命令進行更改。當然,如果/system/沒有寫權限,那本記錄所講述的方法就不適用了。