Java Runtime.getRuntime().exec()不';我不能执行一些命令
我是java初学者,有一些问题。我读过几个关于这个主题的话题,但没有一个对我有用。这是我的密码:Java Runtime.getRuntime().exec()不';我不能执行一些命令,java,linux,terminal,Java,Linux,Terminal,我是java初学者,有一些问题。我读过几个关于这个主题的话题,但没有一个对我有用。这是我的密码: try { Console console = System.console(); String command; while(true) { command = console.readLine("Enter input:"); Process proc = Runtime.ge
try
{
Console console = System.console();
String command;
while(true)
{
command = console.readLine("Enter input:");
Process proc = Runtime.getRuntime().exec(command);
// Read the output
BufferedReader reader =
new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
while((line = reader.readLine()) != null) {
System.out.print(line + "\n");
}
proc.waitFor();
}
}
catch(Exception e) {}
所以我尝试的是制作一个java程序并在其中运行终端命令(我使用的是linux)。这个程序可以使用诸如“ls”、“ps-ef”等命令,但当我键入“cd”时它不起作用。我知道cd会产生不同的进程,应该这样使用:“Runtime.exec(String命令,String[]envp,File dir)”。我的问题是:如何让我的程序运行各种终端命令?对不起,如果这个问题听起来很傻。谢谢。您实际上需要运行您想要使用的控制台(如sh、csh、bash等),然后使用进程OutputStream输入命令我认为问题不在于您的代码,而在于命令 如果您的命令是cd,您希望看到什么 在后台,它改变了路径,但你什么也得不到
更改目录不会处理任何输出。cd命令是shell内置命令。通过
exec(…)
运行命令时没有shell。实际上,如果您试图在系统的任何bin
目录中查找cd
命令,您将找不到一个。。。因为它不可能作为常规命令执行
如果您试图使用cd
来更改JVM本身的当前目录,那么这将不起作用,因为命令只能更改自身的当前目录以及(之后)它自己启动的命令。它无法将其父进程更改为当前目录
如果您试图使用cd
更改后续命令的当前目录,则该操作也不会起作用。命令完成时,设置当前目录的上下文结束
事实上,使用exec
更改命令运行目录的正确方法是通过ProcessBuilder
API本身进行设置
如何让我的程序运行各种终端命令 你不能。有些“终端命令”仅作为shell命令才有意义,这意味着您需要一个shell 我想,您可以考虑在java代码中模拟所需的行为。这将适用于
cd
。。。但其他命令可能更难处理
(无论如何,在Java中实现一个与POSIX兼容的shell是可能的。这只是一个很大的工作。)这对我来说很有用:
Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );
Isnt Console=System.Console();默认情况下,这个命令生成bash?不,它不是这样做的。所有这些都是对运行Java的控制台(如果有的话)的引用。您需要打开另一个控制台,正如我所建议的,问题是:“cd”不是命令;这是你的外壳的功能!当像您这样从Java运行命令时;没有贝壳!因此它不起作用!还有一件事:也许你的项目只是学习java概念;但一般来说:允许用户提供任何类型的命令,然后执行它们。。。这是一个非常糟糕的主意。您可能还需要检查此线程。实际上,它正在退出这个项目。使用cd命令,它应该打开目录,但不显示任何内容。在try-catch中添加一个系统并查找错误日志,这样就无法在java中创建类似ssh的程序了?哪个执行每个终端命令?您是否尝试使用
ssh
运行cd
?它有用吗?你试过exec(“sh-c cd”)?它有用吗?正如我在回答中所说的,用Java实现POSIX外壳是可能的。用C编写这种程序会更容易吗?