Java通过SSH连接路由器输入命令并读取响应的操作方法

 更新时间:2024年01月12日 09:01:37   作者:张晓风  
最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应,接下来通过本文给大家介绍下Java通过SSH连接路由器,输入命令并读取响应,需要的朋友可以参考下

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

1.添加mwiede/jsch依赖

  • 如果使用Maven,可以在pom.xml文件中添加以下依赖:
<dependencies>
    <dependency>
        <groupId>com.github.mwiede</groupId>
        <artifactId>jsch</artifactId>
        <version>0.2.15</version>
    </dependency>
</dependencies>
  • 如果使用Gradle,则添加到build.gradle文件:
dependencies {
    implementation 'com.github.mwiede:jsch:0.2.15'
}

2.使用Jsch创建SSH连接,输入命令并返回响应

/** 
*  获取SSH命令响应
* @param userName        用户名
* @param password        密码
* @param host              ip地址
* @param port              端口
* @param commandList  命令列表
*/
public String getShellCmdRes(String userName, String password, String host, Integer port, List<String> commandList) throws JSchException, IOException {
        StringBuilder stringBuilder = new StringBuilder();
        JSch jsch = new JSch();
        Session session = jsch.getSession(userName, host, port());
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        ChannelShell channel = (ChannelShell) session.openChannel("shell");
        // 获取输入输出流
        OutputStream inputStreamForTheChannel = channel.getOutputStream();
        InputStream outputStreamForTheChannel = channel.getInputStream();
        // 连接通道
        channel.connect();
        PrintStream commander = new PrintStream(inputStreamForTheChannel, true);
        byte[] tmp = new byte[1024];
        while (true) {
            while (outputStreamForTheChannel.available() > 0) {
                int i = outputStreamForTheChannel.read(tmp, 0, 1024);
                if (i < 0) {
                    break;
                }
                String output = new String(tmp, 0, i);
                // 读取响应
                stringBuilder.append(output);
                stringBuilder.append(System.lineSeparator());
                // 发送命令
                commandList.forEach(command -> {
                    commander.println(command);
                });
            }
            if (channel.isClosed()) {
                if (outputStreamForTheChannel.available() > 0) {
                    continue;
                }
                break;
            }
            try {
                Thread.sleep(10);
            } catch (Exception ee) {
            }
        }
        // 关闭通道和会话
        channel.disconnect();
        session.disconnect();
        return stringBuilder.toString();
    }

3.调用上文方法

3.1 单条命令

记得结束时加入退出语句,这里以路由器为例,用quit退出

List<String> commandList = new  ArrayList<>();
// 查看
commandList.add("display bfd session all");
// 退出会话
commandList.add("quit");
// 获取响应
String response = getShellCmdRes("admin", "admin", "1.1.1.1", 22, List<String> commandList)

3.2 多条命令

如果是多条命令,每进入一个会话,就多一个退出语句

List<String> commandList = new ArrayList<>();
// 进入system-view
commandList.add("system-view");
// 进入Tunnel 0/0/5
commandList.add("interface Tunnel 0/0/5");
// 查看信息
commandList.add("display this");
// 退出Tunnel 0/0/5
commandList.add("quit");
// 退出system-view
commandList.add("quit");
// 退出会话
commandList.add("quit");
// 获取响应
String response = getShellCmdRes("admin", "admin", "1.1.1.1", 22, List<String> commandList)

到此这篇关于Java通过SSH连接路由器,输入命令并读取响应的文章就介绍到这了,更多相关Java输入命令并读取响应内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring的@Conditional详解

    Spring的@Conditional详解

    这篇文章主要介绍了Spring的@Conditional详解,给想要注入Bean增加限制条件,只有满足限制条件才会被构造并注入到Spring的IOC容器中,通常和@Bean注解一起使用,需要的朋友可以参考下
    2024-01-01
  • SpringBoot入门之集成Druid的方法示例

    SpringBoot入门之集成Druid的方法示例

    这篇文章主要介绍了SpringBoot入门之集成Druid的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Spring security登录过程逻辑详解

    Spring security登录过程逻辑详解

    这篇文章主要介绍了SSpringsecurity登录过程逻辑详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • WebService教程详解(一)

    WebService教程详解(一)

    WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求,接下来通过本文给大家介绍WebService教程详解(一),对webservice教程感兴趣的朋友一起学习吧
    2016-03-03
  • springboot自定义异常视图过程解析

    springboot自定义异常视图过程解析

    这篇文章主要介绍了springboot自定义异常视图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot集成MaxCompute的示例代码

    SpringBoot集成MaxCompute的示例代码

    这篇文章主要介绍了SpringBoot集成MaxCompute的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 解决Feign异步调用丢失上下文问题

    解决Feign异步调用丢失上下文问题

    在微服务中使用Feign调用时,若需要携带登录状态的Cookie信息,通常会使用拦截器,但在异步调用(如order服务异步调用会员服务和购物车服务)时,拦截器可能无法获取上下文信息,导致异常,解决方法是将RequestContextHolder的数据同步到新开启的线程中
    2024-11-11
  • 详解OAuth2 Token 一定要放在请求头中吗

    详解OAuth2 Token 一定要放在请求头中吗

    这篇文章主要介绍了详解OAuth2 Token 一定要放在请求头中吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java使用设计模式中的代理模式构建项目的实例展示

    Java使用设计模式中的代理模式构建项目的实例展示

    这篇文章主要介绍了Java使用设计模式中的代理模式构建项目的实例展示,代理模式中的代理对象可以在客户端和目标对象之间起到中介的作用,需要的朋友可以参考下
    2016-05-05
  • 关于synchronized、volatile、ReentrantLock的区别与对比

    关于synchronized、volatile、ReentrantLock的区别与对比

    这篇文章主要介绍了关于synchronized、volatile、ReentrantLock的区别与对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论