SSHD实践(三)使用Exec执行远程命令

Sftp
placeholder image
admin 发布于:2023-11-25 23:00:12
阅读:loading

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

1.简单介绍

ChannelExec是Apache Mina SSHD中的一个类,它用于执行远程命令。以下是ChannelExec的详细介绍和特征:

(1)远程命令执行:ChannelExec允许您在远程服务器上执行命令,它通过SSH协议将命令发送到服务器,并返回命令的执行结果。这使得您可以通过SSH连接远程服务器并执行特定的命令。

(2)异步执行:ChannelExec支持异步执行命令,这意味着您可以在命令发送之后继续执行其他操作,而不需要等待命令执行完毕。它使用回调机制来处理命令的执行结果,使您能够通过事件处理代码异步获取命令的执行状态和结果。

(3)命令参数设置:ChannelExec允许您设置命令的各种参数,例如工作目录、环境变量、输入流等。您可以根据需要设置这些参数,以满足对命令执行的特定要求。

(4)输入输出处理:ChannelExec提供了输入输出流来处理命令的输入和输出。您可以将输入流写入到远程命令的标准输入,然后通过读取输出流来获取命令的标准输出。这使您可以与远程命令进行交互,并获得执行结果。

(5)命令状态监控:通过ChannelExec,您可以监视命令的执行状态,包括是否执行成功、执行时间等。这对于需要实时监控和处理命令执行过程的场景非常有用。

总的来说,ChannelExec提供了一种在SSH连接上执行远程命令的方式,以及处理命令输入、输出、参数和状态的能力。它灵活性高、可扩展性强,适用于需要与远程服务器进行命令交互和执行的场景。

2.代码示例

package cn.chendd.sshd;

import .....;

/**
 * 运行命令测试
 *
 * @author chendd
 * @date 2023/11/25 20:50
 */
public class ExecTest {

    /**
     * 执行脚本
     */
    @Test
    public void commandTest() throws IOException {
        SshClient sshClient = SshClient.setUpDefaultClient();
        sshClient.start();
        SftpParam param = new SftpParam();
        ClientSession session = sshClient.connect(param.getUsername(), param.getHost(), param.getPort()).verify(5 , TimeUnit.SECONDS).getSession();
        session.addPasswordIdentity(param.getPassword());
        session.auth().verify();
        String commands = StringUtils.join(new String[] {"ip addr" , "pwd" , "ping -c 5 127.0.0.1" , "ll" , "ls"} , ";");
        System.out.println("执行命令列表:" + commands);
        try (ChannelExec channel = session.createExecChannel(commands)) {
            channel.open().verify(5 , TimeUnit.SECONDS);
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(channel.getInvertedOut()))) {
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    System.out.println(line);
                }
            }
        }
        System.out.println("ExecTest.execTest");
        session.close();
        sshClient.close();
    }

}

3.示例说明

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

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

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

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

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

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

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

4.示例预览

SSHD远程命令执行Exec.gif


5.其它说明

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

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

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

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


 点赞


 发表评论

当前回复:作者

 评论列表


留言区