簡體   English   中英

是否可以從Android應用程序執行Shell腳本

[英]Is it possible to execute Shell scripts from Android application

我一直在試驗Android終端模擬器Termux。

它是一個出色的應用程序,允許訪問Android操作系統而無需root訪問權限。

我希望能夠實現的是在同一設備上安裝的另一個Android應用程序中在Termux中執行腳本/命令。

我相信Termux曾經允許通過意圖執行Tasker任務,但是現在看來並非如此。

是否可以通過來自其他Android應用程序的Termux(或任何其他此類應用程序)執行一組命令腳本。

要么...

是否可以訪問底層Android操作系統並從Android應用程序中執行腳本?

UPDATE

當我從Android應用程序執行此代碼時

    try {
        ProcessBuilder pb = new ProcessBuilder("pkg", "install -y", "ffmpeg python");
        final Process p = pb.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            Log.d(TAG, "onCreate(2): " + line);
        }
    } catch (Exception ex) {
        Log.e(TAG, "onCreate: ", ex);
    }

我收到此錯誤消息

java.io.IOException: Cannot run program "pkg": error=13, Permission denied
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
        at org.home.assignment.shell.MainActivity.commandThree(MainActivity.java:32)
        at org.home.assignment.shell.MainActivity.onCreate(MainActivity.java:21)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3243)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3407)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7343)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933)
     Caused by: java.io.IOException: error=13, Permission denied
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
        at java.lang.ProcessImpl.start(ProcessImpl.java:141)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
        at org.home.assignment.shell.MainActivity.commandThree(MainActivity.java:32) 
        at org.home.assignment.shell.MainActivity.onCreate(MainActivity.java:21) 
        at android.app.Activity.performCreate(Activity.java:7802) 
        at android.app.Activity.performCreate(Activity.java:7791) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3243) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3407) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7343) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933) 

但是com.termux可以執行這樣的命令。 如何在我的應用程序中獲得執行這些命令的權限?

據我所知,它有效。 我認為應該是這樣,因為這是有多少Linux GUI應用程序通過發出shell命令來完成他們的一些工作。

為了確保這一點,我嘗試將一個vanilla命令的輸出發送到舊的,低端的,無根的Android 6.0手機上的Logcat ,並且它起作用(下面的工作代碼)。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] cmd = new String[]{"ls", "-la", "/"};

        try {
            // These two lines are what we care about
            Process process = Runtime.getRuntime().exec(cmd);
            InputStream iStream = process.getInputStream();

            // This is how we check whether it works
            tryWriteProcessOutput(iStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void tryWriteProcessOutput(InputStream iStream) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));

            String output = "";
            String line;

            try {
                while ((line = reader.readLine()) != null) {
                    output += line + "\n";
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                reader.close();
            }

        Log.d("cmdOutput", output);
    }
}

但是,您的里程數可能會有很大不同。 有這么多的Android制造商,我希望在不同的設備上有不同版本的命令shell,因此我不希望每個Android設備能夠運行我投入的任何命令,除非它是一個非常常見的命令。

此外,您可能還會遇到命令本身而不是命令shell(即busybox: Permission denied )的系統權限問題。

Termux是一個終端模擬器,但無法訪問Android操作系統中的所有內容。 最終它是一個應用程序,並將面臨任何其他應用程序在Android中的限制。 APTpkg和其他軟件包安裝程序或軟件包安裝在模擬器中,但不在系統范圍內安裝。 此外,某些命令將具有與您的情況類似的限制,例如, pm只能使用root或adb shell執行,因為允許其用戶ID執行此類操作,而其他應用程序則不允許。 意味着運行命令pm install -r -t someapp.apk會在Termux中出錯,而如果使用adb shell或具有root權限肯定會有效。

為了使事情更加清晰,在Termux中運行命令echo $PATH將顯示僅包含Termux命令的目錄,它們不是Android OS命令,而是可以在Android OS上運行的已編譯軟件包。 這是一種很好的方式,可以在頂級Android上運行,而不必處理很多限制,更像是沙盒環境。 安裝某些需要離開沙箱的軟件包將面臨問題,因此請注意這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM