我正在telnetSSH shell会话上运行命令,为了获得该命令,我在官方示例后面使用了JSch 。
telnet
我也在 StackOverflow* 上也遵循此示例编写了自己的代码 *
这是 我的代码:
package Utility; import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; public class JavaTelnet { public static void main(String[] arg) { try { System.out.println(telnetConnection(USER_ID,PASSWORD,REMOTE_HOST)); } catch (Exception e) { e.printStackTrace(); } } public static String telnetConnection(String user, String password, String host) throws JSchException, Exception { JSch jsch=new JSch(); Session session=jsch.getSession(user, host, 22); session.setPassword(password); // It must not be recommended, but if you want to skip host-key check, session.setConfig("StrictHostKeyChecking", "no"); session.connect(); //session.connect(30000); // making a connection with timeout. Channel channel=session.openChannel("shell"); channel.connect(); DataInputStream dataIn = new DataInputStream(channel.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(dataIn)); DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream()); dataOut.writeBytes("telnet localhost 4242\r\n"); /* * telnet COMMANDS here */ dataOut.writeBytes("exit\r\n"); dataOut.writeBytes("logout\r\n"); dataOut.flush(); String line = reader.readLine(); String result = line +"\n"; while ((line= reader.readLine())!=null){ result += line +"\n"; } dataIn.close(); dataOut.close(); System.out.println("disconnecting...."); channel.disconnect(); session.disconnect(); return "done"; } }
看起来不错,但奇怪的是 它只能在调试模式下工作 。如果我运行它,程序将无法执行。我认为它锁定 了while循环, 但是我不明白为什么。没有while循环,代码将到达终点,但是不执行任何shell命令。
我正在使用Netbeans 作为IDE
您能帮我发现问题吗?
我知道了。
__在while循环中, line 永远不会为 null 。
为何在调试中起作用仍是一个谜。
我正在发布 新代码 。我希望它对每个想做类似事情的人都有帮助。
package Utility; import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; public class JavaTelnet { public static void main(String[] arg) { try { System.out.println(telnetConnection(YOUR_COMMAND,YOUR_USER,YOUR_PASS,YOUR_HOST)); } catch (Exception e) { e.printStackTrace(); } } public static String telnetConnection(String command, String user, String password, String host) throws JSchException, Exception { JSch jsch=new JSch(); Session session=jsch.getSession(user, host, 22); session.setPassword(password); // It must not be recommended, but if you want to skip host-key check, session.setConfig("StrictHostKeyChecking", "no"); session.connect(3000); //session.connect(30000); // making a connection with timeout. Channel channel=session.openChannel("shell"); channel.connect(3000); DataInputStream dataIn = new DataInputStream(channel.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(dataIn)); DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream()); System.out.println("Starting telnet connection..."); dataOut.writeBytes("telnet localhost 4242\r\n"); // dataOut.writeBytes("enable\r\n"); dataOut.writeBytes(command+"\r\n"); dataOut.writeBytes("exit\r\n"); //exit from telnet dataOut.writeBytes("exit\r\n"); //exit from shell dataOut.flush(); String line = reader.readLine(); String result = line +"\n"; while (!(line= reader.readLine()).equals("Connection closed by foreign host")){ result += line +"\n"; } dataIn.close(); dataOut.close(); channel.disconnect(); session.disconnect(); return result; } }
注意,该外壳是Linux外壳。在Windows中,“退出”命令应该不同