gpt4 book ai didi

android - 是否可以从 Android 应用程序执行 Shell 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:46 30 4
gpt4 key购买 nike

我一直在尝试使用 Android 终端模拟器 Termux。

这是一款出色的应用程序,无需根访问权限即可访问 Android 操作系统。

我希望能够实现的是从安装在同一设备上的另一个 Android 应用程序中在 Termux 中执行脚本/命令。

我相信 Termux 曾经允许通过 Intent 执行 Tasker 任务,但现在情况似乎并非如此。

是否可以通过 Termux(或任何其他此类应用程序)从另一个 Android 应用程序执行一组命令的脚本。

或者...

是否可以访问底层 Android 操作系统并从 Android 应用程序中执行脚本?

更新

当我从我的 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 命令来完成它们的一些工作。

为了确定,我尝试在一台旧的、低端的、无根的 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)。

关于android - 是否可以从 Android 应用程序执行 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57019096/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com