ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java通过SSH连接路由器,输入命令并读取响应 [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2024-3-29 22:36
标题: Java通过SSH连接路由器,输入命令并读取响应
最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应。
1.添加mwiede/jsch依赖

  1. <dependencies>
  2.     <dependency>
  3.         <groupId>com.github.mwiede</groupId>
  4.         <artifactId>jsch</artifactId>
  5.         <version>0.2.15</version>
  6.     </dependency>
  7. </dependencies>
复制代码
  1. dependencies {
  2.     implementation 'com.github.mwiede:jsch:0.2.15'
  3. }
复制代码
2.使用Jsch创建SSH连接,输入命令并返回响应
  1. /**
  2. *  获取SSH命令响应
  3. * @param userName        用户名
  4. * @param password        密码
  5. * @param host              ip地址
  6. * @param port              端口
  7. * @param commandList  命令列表
  8. */
  9. public String getShellCmdRes(String userName, String password, String host, Integer port, List<String> commandList) throws JSchException, IOException {
  10.         StringBuilder stringBuilder = new StringBuilder();
  11.         JSch jsch = new JSch();
  12.         Session session = jsch.getSession(userName, host, port());
  13.         session.setPassword(password);
  14.         session.setConfig("StrictHostKeyChecking", "no");
  15.         session.connect();
  16.         ChannelShell channel = (ChannelShell) session.openChannel("shell");
  17.         // 获取输入输出流
  18.         OutputStream inputStreamForTheChannel = channel.getOutputStream();
  19.         InputStream outputStreamForTheChannel = channel.getInputStream();
  20.         // 连接通道
  21.         channel.connect();
  22.         PrintStream commander = new PrintStream(inputStreamForTheChannel, true);
  23.         byte[] tmp = new byte[1024];
  24.         while (true) {
  25.             while (outputStreamForTheChannel.available() > 0) {
  26.                 int i = outputStreamForTheChannel.read(tmp, 0, 1024);
  27.                 if (i < 0) {
  28.                     break;
  29.                 }
  30.                 String output = new String(tmp, 0, i);
  31.                 // 读取响应
  32.                 stringBuilder.append(output);
  33.                 stringBuilder.append(System.lineSeparator());
  34.                 // 发送命令
  35.                 commandList.forEach(command -> {
  36.                     commander.println(command);
  37.                 });
  38.             }
  39.             if (channel.isClosed()) {
  40.                 if (outputStreamForTheChannel.available() > 0) {
  41.                     continue;
  42.                 }
  43.                 break;
  44.             }
  45.             try {
  46.                 Thread.sleep(10);
  47.             } catch (Exception ee) {
  48.             }
  49.         }
  50.         // 关闭通道和会话
  51.         channel.disconnect();
  52.         session.disconnect();
  53.         return stringBuilder.toString();
  54.     }
复制代码
3.调用上文方法

3.1 单条命令

记得结束时加入退出语句,这里以路由器为例,用quit退出
  1. List<String> commandList = new  ArrayList<>();
  2. // 查看
  3. commandList.add("display bfd session all");
  4. // 退出会话
  5. commandList.add("quit");
  6. // 获取响应
  7. String response = getShellCmdRes("admin", "admin", "1.1.1.1", 22, List<String> commandList)
复制代码

3.2 多条命令

如果是多条命令,每进入一个会话,就多一个退出语句
  1. List<String> commandList = new ArrayList<>();
  2. // 进入system-view
  3. commandList.add("system-view");
  4. // 进入Tunnel 0/0/5
  5. commandList.add("interface Tunnel 0/0/5");
  6. // 查看信息
  7. commandList.add("display this");
  8. // 退出Tunnel 0/0/5
  9. commandList.add("quit");
  10. // 退出system-view
  11. commandList.add("quit");
  12. // 退出会话
  13. commandList.add("quit");
  14. // 获取响应
  15. String response = getShellCmdRes("admin", "admin", "1.1.1.1", 22, List<String> commandList)
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4