首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在android上完成终端控制

在android上完成终端控制
EN

Stack Overflow用户
提问于 2019-01-18 19:37:51
回答 1查看 414关注 0票数 0

我一直试图在我的android手机上运行一些Linux命令

代码语言:javascript
复制
Process process = Runtime.getRuntime().exec(COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

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

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

代码语言:javascript
复制
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命令,而不需要用户实际输入命令。

有人能帮助我在我的设备上正确地运行这些命令的起点和基础知识吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-19 03:01:03

Termux声明它不像传统的Linux bash那样工作,因为当它第一次在/ data /data/com.termux/files/usr中的数据目录中设置数据目录时,它设置了自己的虚拟ish环境-- 这里这里,根据官方的android文档exec(command)方法,

在单独的进程中执行指定的字符串命令。 这是一种方便的方法。对表单exec(命令)的调用与调用exec(命令,null,null)的行为完全相同。

因此,如果它是一个单独的进程,那么在执行命令时,它将在该进程的目录中运行它( Linux中的每个进程都得到它的目录,并被分配给os使用的PID )。因此,ls命令提供给您的只是进程目录中的任何内容。您应该像/proc/31415/一样,并且只有一个acct文件(普通Linux中的cgroup)。

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

代码语言:javascript
复制
String[] cmd = {"mkdir", "testDir"};
File env =  new File(getFilesDir().getAbsolutePath());
Runtime.getRuntime().exec(cmd, null, env);

此外,看看Termux的安装程序代码 (exec() )也没什么坏处。它会让您很好地忽略设置环境以及使用基本命令。

另外,我认为您已经这样做了,但是再次检查以确保您正在为您的应用程序请求WRITE_EXTERNAL_STORAGE许可。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54260411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档