马士兵java架构师

您现在的位置是:java学习笔记 >

java学习笔记

java ssh连接并发送命令_实测可用

2023-11-30 15:33:07java学习笔记 本文浏览次数:1 百度已收录

本 文 目 录

首先,我需要澄清一下,SSH连接和发送命令在Java中通常使用第三方库如JSch来实现。根据我的理解,你可能想要了解如何使用JSch库进行SSH连接和发送命令的几种方法,并将它们进行对比。以下是四种常见的方法:

  1. 使用Session对象直接执行命令
  2. 使用ChannelExec对象执行命令
  3. 使用ChannelShell对象执行命令
  4. 使用ChannelSftp对象执行命令
方法 描述
Session对象直接执行命令 直接通过Session对象执行命令,但不推荐,因为这种方式可能会导致安全问题。
ChannelExec对象执行命令 通过创建一个ChannelExec对象并设置其命令来执行命令。
ChannelShell对象执行命令 通过创建一个ChannelShell对象并写入命令到其输入流来执行命令。
ChannelSftp对象执行命令 通过创建一个ChannelSftp对象并调用其exec()方法来执行命令。

接下来,我会给出每种方法的具体代码实现,并逐行解释。

import com.jcraft.jsch.*;

public class SSHExample {
    private static final String USER = 'username';
    private static final String PASSWD = 'password';
    private static final String HOST = 'hostname';

    public static void main(String[] args) throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession(USER, HOST, 22);
        session.setPassword(PASSWD);
        session.setConfig('StrictHostKeyChecking', 'no');
        session.connect();

        // Method 1: Execute command directly using Session object
        String command = 'ls -l';
        Channel channel = session.openChannel('exec');
        ((ChannelExec) channel).setCommand(command);
        channel.setInputStream(null);
        ((ChannelExec) channel).setErrStream(System.err);
        InputStream in = channel.getInputStream();
        channel.connect();
        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0) break;
                System.out.print(new String(tmp, 0, i));
            }
            if (channel.isClosed()) {
                if (in.available() > 0) continue;
                System.out.println('exit-status: ' + channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {}
        }
        channel.disconnect();

        // Method 2: Execute command using ChannelExec object
        ChannelExec execChannel = (ChannelExec) session.openChannel('exec');
        execChannel.setCommand('ls -l');
        execChannel.setInputStream(null);
        execChannel.setOutputStream(System.out);
        execChannel.setExtOutputStream(System.err);
        execChannel.connect();
        execChannel.disconnect();

        // Method 3: Execute command using ChannelShell object
        ChannelShell shellChannel = (ChannelShell) session.openChannel('shell');
        OutputStream out = shellChannel.getOutputStream();
        PrintStream commander = new PrintStream(out, true);
        commander.println('ls -l');
        commander.flush();
        shellChannel.connect();
        shellChannel.disconnect();

        // Method 4: Execute command using ChannelSftp object
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel('sftp');
        sftpChannel.connect();
        String output = sftpChannel.execute('ls -l');
        System.out.println(output);
        sftpChannel.disconnect();

        session.disconnect();
    }
}

以上代码中的四个方法分别实现了SSH连接与发送命令的不同方式。每个方法都包含了创建Channel、设置命令、获取输出以及关闭Channel的过程。请注意替换USER, PASSWD, 和 HOST为实际的用户名、密码和主机名。