栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA实现远程登录主机并执行命令(密码登录和免密登录)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA实现远程登录主机并执行命令(密码登录和免密登录)

引入ssh相关依赖,以maven为例

    com.jcraft
    jsch
    0.1.55

导入工具类
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.KeyPair;
import com.jcraft.jsch.Session;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Objects;


public class SSHTools {

    private static final Logger logger = LoggerFactory.getLogger(SSHTools.class);

    private Session session;

    
    public static SSHTools getInstance() {
        return new SSHTools();
    }

    
    private void loginByPassword(@NotNull String hostIp,
                                 @NotNull Integer hostPort,
                                 @NotNull String user,
                                 @NotNull String password) {
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(user, hostIp, hostPort);
            session.setPassword(password);
            // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
            session.setConfig("StrictHostKeyChecking", "no");
            // 连接超时
            session.connect(1000 * 10);
        } catch (JSchException e) {
            logger.error("登录时发生错误!", e);
        }
    }

    
    private void loginByKey(@NotNull String hostIp,
                            @NotNull Integer hostPort,
                            @NotNull String user,
                            @NotNull String privateKey) {
        try {
            JSch jsch = new JSch();
            jsch.addIdentity(user, privateKey.getBytes(), null, null);
            session = jsch.getSession(user, hostIp, hostPort);
            // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
            session.setConfig("StrictHostKeyChecking", "no");
            // 连接超时
            session.connect(1000 * 10);
        } catch (JSchException e) {
            logger.error("登录时发生错误!", e);
        }
    }

    
    public String executeShell(@NotNull String command) throws Exception {
        logger.info("exe cmd: {}", command);

        byte[] tmp = new byte[1024];
        // 命令返回的结果
        StringBuilder resultBuffer = new StringBuilder();

        ChannelExec exec = (ChannelExec) session.openChannel("exec");
        exec.setCommand(command);
        exec.connect();

        // 返回结果流(命令执行错误的信息通过getErrStream获取)
        InputStream stdStream = exec.getInputStream();
        try {
            // 开始获得SSH命令的结果
            while (true) {
                while (stdStream.available() > 0) {
                    int i = stdStream.read(tmp, 0, 1024);
                    if (i < 0) {
                        break;
                    }
                    resultBuffer.append(new String(tmp, 0, i));
                }
                if (exec.isClosed()) {
                    break;
                }
                try {
                    Thread.sleep(200);
                } catch (Exception e) {
                    logger.error("执行命令发生错误!", e);
                }
            }
        } finally {
            if (exec.isConnected()) {
                exec.disconnect();
            }
        }
        String result = resultBuffer.toString();
        logger.info("exe cmd return : {}", result);
        return result;
    }

    
    public void close() {
        if (Objects.nonNull(session) && session.isConnected()) {
            session.disconnect();
        }
    }

    
    public static Pair generateKeyPair(String comment) throws JSchException {
        JSch jsch = new JSch();
        KeyPair keyPair = KeyPair.genKeyPair(jsch, KeyPair.RSA);
        ByteArrayOutputStream baos;
        //私钥
        baos = new ByteArrayOutputStream();
        keyPair.writePrivateKey(baos);
        String privateKeyString = baos.toString();
        //公钥
        baos = new ByteArrayOutputStream();
        keyPair.writePublicKey(baos, comment);
        String publicKeyString = baos.toString();
        keyPair.dispose();
        return Pair.of(publicKeyString, privateKeyString);
    }
}
密码登录并执行命令demo
    public static void main(String[] args) throws Exception {
        SSHTools sshTools = SSHTools.getInstance();
        try {
            //1.密码登录主机
            sshTools.loginByPassword("主机ip", 22, "root", "主机用户密码");
            //2.执行命令 例如:查看 data 目录下文件
            String executeShell = sshTools.executeShell("ls /data/");
            //3.打印执行结果
            System.out.println(executeShell);
        }finally {
            //4.释放资源
            sshTools.close();
        }
    }
免密登录并执行命令demo
    public static void main(String[] args) throws Exception {
        //1.生成密钥
        Pair pair = SSHTools.generateKeyPair("根据业务随便填");
        //私钥
        String privateKeyString = pair.getRight();
        //公钥
        String publicKeyString = pair.getLeft();

        //2.将公钥去要登录的主机上授权 ,, 去对应的机器上执行以下授权命令   publicKeyString
        String command = "cd ~ && if [ ! -d .ssh ];then mkdir -p .ssh ;fi && cd .ssh && echo " + publicKeyString + " >> authorized_keys && chmod 700 ~/.ssh && chmod 600 authorized_keys"
        //获取公钥授权命令
        System.out.println(command);


        //3.执行完授权命令后就可以免密登录主机了
        SSHTools sshTools = SSHTools.getInstance();
        try {
            //1.免密登录主机
            sshTools.loginByKey("主机ip", 22, "root", privateKeyString);
            //2.执行命令 例如查看 data 目录下文件
            String executeShell = sshTools.executeShell("ls /data/");
            //3.打印执行结果
            System.out.println(executeShell);
        } finally {
            //4.释放资源
            sshTools.close();
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785765.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号