我想依次在Linux上的shell中执行 telnet 和 msh 。我可以使用Java中的以下代码执行telnet命令,但不能执行msh命令:
> print(Ar.model)
Series: d[, 3]
ARIMA(2,0,2) with non-zero mean
Coefficients:
ar1 ar2 ma1 ma2 mean
-0.0566 -0.8144 0.0208 0.8187 0.0262
s.e. 0.1570 0.1050 0.1506 0.1122 0.0183
sigma^2 estimated as 0.9852: log likelihood=-3997.69
AIC=8007.39 AICc=8007.42 BIC=8043.08
对此的任何帮助都非常感谢。
答案 0 :(得分:0)
您应该有两个不同的命令按顺序执行,如下所示: -
String[] command_telnet ={"\path\to\telnet", "10.x.x.x 1234"};
String[] command_msh ={"\path\to\msh", "parameter"};
ProcessBuilder pb_telnet = new ProcessBuilder(commands);
pb_telnet.directory(new File("/home/user/telnet_output.txt"));
pb_telnet.redirectErrorStream(true);
Process process_tel = pb_telnet.start();
对command_msh
执行相同操作。这种方法很容易调试,因为您将在/home/user/msh_output.txt
答案 1 :(得分:0)
您目前正在执行的Java是以下内容(或多或少;以下内容可以在Shell中执行,Java直接调用进程):
/bin/bash -c 'telnet 10.x.x.x 1234' 'msh'
这导致Bash执行telnet,因为这是-c
标志的参数,msh参数将被忽略:Bash不知道如何处理它。
有两种可能的解决方案。
解决方案1:让Bash按顺序执行两个命令。
为此,您需要执行以下行中的内容
/bin/bash -c 'telnet 10.x.x.x 1234; msh'
转换为您必须合并commands
列表中的最后两个字符串。例如,
commands.add("telnet 10.x.x.x 1234; msh");
您也可以使用;
而不是&&
。有关详细信息,请参阅Unix.SE。
缺点:Bash只会告诉您最后一个进程的退出代码。在使用&&
的情况下,第一个命令失败甚至不会执行第二个命令。
解决方案2:为每个人创建一个单独的Java流程。
对于此解决方案,您基本上必须重复所有代码以调用msh。如果你走这条路,我建议把它包装成一个函数。只需使用{"/bin/bash", "-c", "telnet 10.x.x.x 1234"}
作为一个调用的commands
列表,并使用{"/bin/bash", "-c", "msh"}
作为其他调用。
优点是您可以在Java程序中拥有更多控制权,而不是使用Bash处理事物。缺点是你开始了两个不同的过程,但Bash可能会在引擎盖下做到这一点。
附注:您可以直接执行telnet和msh而无需调用Bash并告诉它为您运行telnet或msh。这可能更好,更有效。