JSch实践(二)使用Exec执行远程命令

Sftp
placeholder image
admin 发布于:2023-11-24 15:31:02
阅读:loading

前面介绍了使用JSch的ChannelSftp实现对远程文件的操作,本文继续实践JSch的系列文章,使用ChannelExec来执行一些远程服务器的命令。

1.简单介绍

ChannelExec是 JSch 提供的用于执行远程命令的类。它允许你在远程服务器上执行命令并获取输出结果。

下面是一些关于 `ChannelExec` 的特征和使用说明:

(1)执行任意命令:`ChannelExec` 可以用于执行任何合法的命令,包括系统命令、脚本和自定义命令等。

(2)命令参数传递:你可以通过 `setCommand` 方法设置要执行的命令,还可以通过参数传递命令的选项、参数和参数值。

(3)直接执行和管道执行:`ChannelExec` 支持直接执行单个命令,也支持执行一系列命令并将前一个命令的输出作为下一个命令的输入,实现管道执行。

(4)获取执行结果:通过 `getInputStream` 方法,可以获取到命令的标准输出流,从而获取执行结果。你还可以通过 `getErrStream` 方法获取命令的错误输出流,检查执行期间产生的任何错误信息。

(5)输入输出流处理:你可以将输入流和错误流包装在 `Reader` 类(如 `BufferedReader`)中,以便更方便地处理输出。这样可以逐行读取结果或进行其他处理。

(6)交互式命令:如果需要与执行的命令进行交互,可以使用 `setPty` 或 `setXForwarding` 方法为通道分配终端伪设备,以支持交互式命令的输入和输出。

(7)异步执行:`ChannelExec` 支持异步执行命令,允许执行多个命令并在它们执行完成之前进行其他操作,以提升效率和灵活性。

(8)安全连接:`ChannelExec` 基于 JSch 库,提供了安全的远程连接和交互,支持通过 SSH 协议进行加密和身份验证。

总结来说,`ChannelExec` 是 JSch 库中的一个功能强大的类,可用于在远程服务器上执行命令并获取执行结果。它提供了灵活的命令执行和结果处理的功能,可应用于自动化脚本、远程操作和服务器管理等应用场景。

2.代码示例

package cn.chendd.jsch;

import ...;

/**
 * 运行命令测试
 *
 * @author chendd
 * @date 2023/11/18 14:25
 */
@RunWith(JUnit4.class)
public class ExecTest {

    /**
     * 执行脚本
     */
    @Test
    public void commandTest() throws IOException, JSchException {
        JSch jsch = new JSch();
        SftpParam param = new SftpParam();
        Session session = null;
        ChannelExec channel;
        try {
            session = jsch.getSession(param.getUsername(), param.getHost(), param.getPort());
            final String password = param.getPassword();
            if (StringUtils.isNotEmpty(password)) {
                session.setPassword(password);
            }
            session.setTimeout(param.getTimeout());
            session.setConfig("StrictHostKeyChecking" , "no");
            session.connect();
            channel = (ChannelExec) session.openChannel("exec");
        } catch (JSchException e) {
            if (session != null) {
                session.disconnect();
            }
            throw new RuntimeException(e);
        }
        try {
            this.commandTest(channel);
        } finally {
            channel.disconnect();
            session.disconnect();
        }
    }

    private void commandTest(ChannelExec channel) throws IOException, JSchException {
        String commands = StringUtils.join(new String[] {"ip addr" , "pwd" , "ping -c 5 127.0.0.1" , "ll" , "ls"} , ";");
        System.out.println("执行命令列表:" + commands);
        channel.setCommand(commands);
        channel.connect();
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(channel.getInputStream()))) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

}

3.示例说明

(1)代码为示例,写的比较随意,某些IO资源的释放应以更严格的形式编写;

(2)执行的命令共计5个,分别如下:

   ① ip addr:输出本机的IP地址信息;

   ② pwd:输出当前上下文的所在路径;

   ③ ping -c 5 127.0.0.1:获取与本机的网络连接,共计输出5次;

   ④ ll:获取当前路径的文件夹结构列表;

   ⑤ ls:获取当前路径的文件夹内的文件和文件夹名称列表;

4.示例预览

JSch使用Exec执行命令.gif

5.其它说明

(1)本次实践JSch共计三块知识,分别是使用Sftp访问远程服务器、Exec执行远程服务器命令、Shell执行远程服务器命令,至于它还可以作用于的端口转发等功能不做摸索;;

(2)本文实现了JSch的基于ChannelExcel执行远程命令的示例,在命令执行的同时也可实时输出命令执行的结果输出;

(3)示例中的“ll”命令执行时未获取到执行的结果,具体原因没有深究,多个命令在执行完毕后,自动退出程序;

(4)本文实现了JSch实现远程服务器的命令执行,完整示例工程代码可见《附件下载.zip

 点赞


 发表评论

当前回复:作者

 评论列表


留言区