【问题标题】:Complete terminal control on android在android上完成终端控制
【发布时间】:2019-01-18 19:37:51
【问题描述】:

我一直在尝试使用

在我的安卓手机上运行一些 Linux 命令
Process process = Runtime.getRuntime().exec(COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

并注意到,即使设备以 SuperSU 为根,我也只能运行特定命令并获得正确的输出(我还使用没有 SuperSU 的设备对其进行了测试)。

例如,如果我运行ls 并尝试将其放在屏幕上(通过TextView),如下所示:

public void onBtnClick(View view) {
    try {
        EditText commandLine = findViewById(R.id.commandText);
        Process process = Runtime.getRuntime().exec(commandLine.getText().toString());
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        ((TextView) findViewById(R.id.mainTextView)).setText(((TextView) findViewById(R.id.mainTextView)).getText() + "\n" + in.readLine());
        commandLine.setText("");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

输出是acct,这是有道理的。

但另一方面,如果假设我运行pwd,它会给我以下错误:

W/System.err:java.io.IOException:运行 exec() 时出错。命令: [pwd] 工作目录:null 环境:null

我在网上做了一些研究,偶然发现Termux 可以通过终端完全控制手机,这正是我想要做的(出于我自己的学习和测试目的)。

虽然它只是一个模拟器,但它可以完全按照我的意愿做,但唯一的问题是它需要我通过终端输入命令。

我在这里的目的是复制 Termux 为我自己所做的事情,以便我可以从应用程序的 Java 代码中正确运行 Linux 命令,而不需要用户实际输入命令。

谁能帮助我从哪里开始以及在我的设备上正确运行这些命令的基础知识?

【问题讨论】:

  • 自从Termux is open source,你可以看看Termux是怎么做的。
  • 我的期望是您遇到的命令不是由程序实现的,而是由 shell 实现的。而且由于您没有运行 shell,因此这些命令不存在。解决方案是自己实现它们,或者先运行一个 shell 并通过它来 pip 命令。
  • 那么你的问题到底是什么?
  • @CommonsWare 哇哦……我怎么会错过呢?谢谢

标签: android linux terminal


【解决方案1】:

Termux 声明它不像传统的 Linux bash 那样工作,因为它在 /data/data/com.termux/files/usr 的数据目录中首次设置时设置了自己的虚拟环境,请参阅@987654321 @和here 另外,根据the official android docsexec(command)方法,

在单独的进程中执行指定的字符串命令。

这是一种方便的方法。调用 exec(command) 形式 行为方式与调用 exec(command, null, 空)。

因此,如果它是一个单独的进程,则在执行命令时,它将在该进程的目录中运行它(Linux 中的每个进程都获取其目录并分配给 os 使用的 PID)。因此,ls 命令给您的只是该进程目录中的任何内容。你应该在 /proc/31415/ 这样的地方,并且只有一个 acct 文件(常规 Linux 中的 cgroup)。

您应该做的是通过在调用 getRuntime().exec() 时声明它来在目录中运行命令,请参阅上面的链接以找到您需要的正确命令。我建议使用处理所有参数的覆盖。 你需要这样的东西:

String[] cmd = {"mkdir", "testDir"};
File env =  new File(getFilesDir().getAbsolutePath());
Runtime.getRuntime().exec(cmd, null, env);

此外,看看 Termux 的 installer code (exec() 也没什么坏处。它可以让您很好地了解设置环境以及使用基本命令。

另外,我认为您已经完成了,但请仔细检查以确保您正在为您的应用程序请求 WRITE_EXTERNAL_STORAGE 权限。

【讨论】:

  • 谢谢!很棒的答案!
  • @ElyShaffir 还确保您想要运行的命令会严重损害用户设备
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2015-09-06
  • 1970-01-01
  • 2021-03-30
  • 2015-08-21
  • 2012-01-26
相关资源
最近更新 更多