在Android上完成终端控制

时间:2019-01-18 19:37:51

标签: android linux terminal

我一直在尝试使用

在我的android手机上运行一些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命令,而无需用户实际输入命令。

有人可以帮助我从哪里开始以及在设备上正确运行这些命令的基础吗?

1 个答案:

答案 0 :(得分:3)

Termux表示它不能像传统的Linux bash那样工作,因为它首先在/data/data/com.termux/files/usr中的数据目录中设置时会设置自己的虚拟环境,请参阅{{ 3}}和here 另外,根据hereexec(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的the official android docs(exec()。这对您设置环境以及使用基本命令很有帮助。

此外,我认为您已经完成了操作,但请仔细检查以确保您正在为自己的应用请求WRITE_EXTERNAL_STORAGE权限。