我正在尝试使用jsch ssh类(com.jcraft.jsch)在unix中执行一些工具。 我的工具有一个选择菜单。 我需要转到工具所在的文件夹,执行它并选择所需的选项。 在每个命令之后,(cd,execute,...)我希望检查输出并检查状态代码(0/1)。 我有以下代码按预期执行它但在此代码中我无法找到在每个命令后检查输出的方法。
Session session = _getConnectedSession();
Channel channel = session.openChannel("shell");
channel.connect();
InputStream is = channel.getInputStream();
BufferedReader dataIn = new BufferedReader(new InputStreamReader(is, "UTF-8"));
DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());
// send ls command to the server
enter code here dataOut.writeBytes("cd tools; run tool\n");
dataOut.writeBytes("4\r\n"); // option 4 in the tool
dataOut.writeBytes("4\r\n"); // then, option 4 in the tool
dataOut.writeBytes("6\r\n"); // then, option 6 in the tool
dataOut.writeBytes("n\r\n"); // then, option n in the tool
dataOut.flush();
String line = dataIn.readLine();
while ((line = dataIn.readLine()) != null) {
System.out.println(line);
}
if(channel.isClosed()){
system.out.println("exit-status: "+channel.getExitStatus());
}
dataIn.close();
dataOut.close();
channel.disconnect();
session.disconnect();
我无法找到方法但是如何将命令分开并逐个打印(在while循环中),而不是像上面那样。
我尝试将所有命令拆分为两个批量,如下所示,但它只打印并执行第一批命令(在第一个while循环之前):
// First bulk of commands
enter code here dataOut.writeBytes("cd tools; run tool\n");
dataOut.writeBytes("4\r\n"); // option 4 in the tool
dataOut.writeBytes("4\r\n"); // then, option 4 in the tool
dataOut.flush();
String line = dataIn.readLine();
while ((line = dataIn.readLine()) != null) {
System.out.println(line);
}
// Second bulk of commands
dataOut.writeBytes("6\r\n"); // then, option 6 in the tool
dataOut.writeBytes("n\r\n"); // then, option n in the tool
dataOut.flush();
line = dataIn.readLine();
while ((line = dataIn.readLine()) != null) {
System.out.println(line);
}
if(channel.isClosed()){
system.out.println("exit-status: "+channel.getExitStatus());
}
我做错了吗?
答案 0 :(得分:0)
首先,您还没有设置输出流并检查您必须使用的上次执行命令的退出状态
<强>&#34; $&#34?; - 如果为0,则上次执行的命令成功,否则失败。
以下代码段允许您发出命令并读取该命令的响应代码。
ss=new StringBuilder("ls | echo $?");
ss.append("\n");
FileWriter fw = new FileWriter("comm.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write(ss.toString());
bw.flush();
fw.close();
bw.close();
InputStream is=new FileInputStream("comm.txt");
OutputStream os=new FileOutputStream("outs.txt");
channel.setInputStream(is);
channel.setOutputStream(os);
Thread.sleep(1000);
channel.connect();
System.out.println("connected");
f.dispose();
getApplication();
在上面的代码中我使用了&#34; comm.txt&#34;作为输入流和&#34; outs.txt&#34;作为输出流。您可以使用Scanner类更改stringBuilder对象的内容。
如果成功执行ls,则ls | echo $?&#34;
将产生0,否则将为非零值。可以在outs.txt文件中检查此值。
如果outs.txt文件的内容为0,则命令正确执行,否则无法正确执行。您必须编写代码以从outs.txt文件中读取内容。
如果你想要完整的代码,你可以看到我的项目
在那里看到&#34; Cloud.java&#34;文件为完整代码。