Java通过SSH连接路由器,输入命令并读取响应

打印 上一主题 下一主题

主题 862|帖子 862|积分 2596

最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应。
1.添加mwiede/jsch依赖


  • 如果使用Maven,可以在pom.xml文件中添加以下依赖:
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>com.github.mwiede</groupId>
  4.         <artifactId>jsch</artifactId>
  5.         <version>0.2.15</version>
  6.     </dependency>
  7. </dependencies>
复制代码

  • 如果使用Gradle,则添加到build.gradle文件:
  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)
复制代码


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表