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

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

1.添加mwiede/jsch依赖

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

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

java 复制代码
/** 
*  获取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退出

java 复制代码
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 多条命令

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

java 复制代码
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)
相关推荐
Spring_java_gg13 分钟前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
blammmp20 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵39 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong43 分钟前
Java反射
java·开发语言·反射
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
方方怪1 小时前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐2 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。2 小时前
Spring Boot 配置文件
java·spring boot·后端