我正在尝试使用JSch在java中获取shell脚本的输出。执行sudo
admin命令并获取脚本的输出。
Properties prop = new Properties();
InputStream input = null;
String host="myhost";
StringBuilder command1= new StringBuilder();
String userName = "root";
String password="password";
try{
JSch jsch = new JSch();
Session session = jsch.getSession(userName, host, 22);
session.setPassword(password);
session.connect();
System.out.println("Connected");
List<String> commands = new ArrayList<String>();
commands.add("ls");
commands.add("sudo myadmincmd");
commands.add("cd /logs");
commands.add("my script...");
Channel channel = session.openChannel("shell");
channel.connect();
channel.setOutputStream(System.out);
OutputStream os = channel.getOutputStream();
PrintStream shell = new PrintStream(os, true);
for (String cmd : commands) {
shell.println(cmd);
try {
Thread.sleep(2000);
}
catch (Exception ee) {
}
}
shell.println("exit");
shell.close();
channel.disconnect();
session.disconnect();
}catch(Exception e){
e.printStackTrace();
}
输出:
*ADMINSHELL* :/home/abcd # cd /logs
*ADMINSHELL* :/logs #
*ADMINSHELL* :/logs # my script...
....
output goes here...
....
如何才能获得此ADMINSHELL的输出?例如,我只需要最终输出。我尝试使用如下检查,
for (String cmd : commands) {
if(cmd.startsWith("for script")){
shell.println(cmd);
}
try {
Thread.sleep(2000);
}
catch (Exception e) {
}
}
但这次我得到一些许可被拒绝的问题。我只需要最后一个脚本的输出。
....
output goes here...
....
答案 0 :(得分:1)
您必须将输出读取到某个缓冲区/字符串。然后解析并仅打印您想要的部分。
请参阅How to get jsch shell command output in String。
没有其他方法可以分开各个命令的输出。从SSH客户端的角度来看,shell只是一个带输入/输出的黑盒子。没有结构。
当您在脚本之前和之后打印一些分隔符时会有所帮助:
echo ---begin---
/.../myscript.sh
echo ---end---