我怎么能执行所有可能的UNIX(壳)命令的机器人编程?(How can I execute all

2019-09-16 17:34发布

我有这个PHP文件发送到我的Android应用程序的命令:

我曾尝试与合作:

Runtime.getRuntime().exec(commandLine);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

但命令呼应,PWD和其他一些人不工作。

我得到以下异常:

java.io.IOException: Error running exec(). Command: [pwd] Working Directory: null Environment: null

据我了解,这是因为没有任何的shell环境。

然后我试图在.SH提交书面我想要的命令,然后执行命令是这样的:

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("sh /runCmds/shTest.sh");
InputStream is = proc.getInputStream();

并得到有效解决与PWD,回声问题,大部分的命令。

但后来我意识到,我要保持我执行命令的状态。 例如,我想改变目录( cd data )和执行命令mkdir Apoel

这里是当我面对我的问题。 该怎么办?

我想出了另一个想法:

做一个shell脚本(.SH),并且每个用户想要执行命令附加在它新的命令时(并再次运行该脚本孔(.SH))。 但我觉得是不是做一个很好的方法!

有没有简单的办法了吗? 我的应用程序可以轻松地打开一个终端?

下面是我发现终端仿真程序的代码,但它太复杂!

https://github.com/jackpal/Android-Terminal-Emulator

Answer 1:

一个交互式shell是其中一个保持运行,等待它从stdin接收新的命令,而产生其输出到输出和错误 - 作为一个结果,它的环境,其包括的任何变化被保留用于该会话的持续时间。 用于壳是有用给用户,标准输入,斯陶德,标准错误需要被通过到用户连接 - 经由控制台,串行线,或xterm的等

在Android上,通常是你做的是钩到对应于标准输入,标准输出,标准错误,为您所创建的shell进程的管道,并利用它们在你的Java程序提供的命令来推动,并接受输出你的程序解释/显示。

创建脚本并运行它只会在之前的任何人执行所有指令被输入的情况下工作的想法。



Answer 2:

首先,一些背景。 在任何的Posix系统中,在外壳中,有2种类型的命令:

  1. 内部命令(PWD,CD,回声)
  2. 外部命令(LS,CP,MV,有时回声以及)

所有目录上下文命令(CD,PWD等)是在外壳内部实现的命令,因此需要外壳保持运行,如果变化是持有(例如为。 cd /data/local/tmp )。

在另一方面,外部命令是独立的,可以indepenedently运行,但获得他们的目录上下文从他们的父进程(在大多数情况下,壳)。

现在要解决的问题。 是的,使用脚本是一个好主意,但它是痛苦的实现,因为它需要文件编辑的开销。 但是,我们可以用shell即时创建一个脚本,并使用了执行它-c选项。 例如:

/system/bin/sh -c 'cd /data/local/tmp; touch abc; cp abc def; cd /; rm /data/local/tmp/abc'

在夏日:

String sPrefix="/system/bin/sh -c 'cd someplace;";
String sInputCmd=getCommand(); // this is simulating your command input
String sPostfix="'";

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(sPrefix+sInputCmd+sPostfix); // sh -c 'cd someplace; echo do something'
InputStream is = proc.getInputStream();

然而,这并没有给我们设定的目录范围内的能力,所以我们需要来模拟。 目录的上下文可以通过使用的Runtime.exec(字符串命令,字符串[] envp,文件DIR)的方法加入。 有了这个,我们必须维持命令之间的目录范围内的可能性。 但是,我们如何真正做到这一点? 一个解决办法是追加pwd的命令,并把输出作为新目录范围内的最后一行。 从而

String sPath = "/"; // start in root directory
String sPrefix = "/system/bin/sh -c 'cd someplace;";
String sInputCmd; // this is simulating your command input
String sPostfix = ";echo;pwd'";
Runtime rt = Runtime.getRuntime();
while(!(sInputCmd=getCommand()).equals("")) {
    File dir= new File(sPath);
    Process proc = rt.exec(sPrefix+sInputCmd+sPostfix, NULL, dir);
    InputStream is = proc.getInputStream();
    // Do processing on input.
    sPath= last_line_of_is ;
}

最后,最后一个选项是在终端仿真器中集成到你的应用程序。

[1] http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String%5B%5D,%20java .io.File 29%



文章来源: How can I execute all the possible unix(shell) commands in android programmatically?