微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 使用SSH协议连接到远程Shell执行脚本

使用场景
有时候我们希望对某服务器进行一定的操作但又不想在上边装一个服务端程序
解决方
我找了一些java ssh2的工具,如:Jsch、SSHD、SSHJ。最终选择先试试Jsch来实现远程执行shell指令
吐槽
Jsch 的实例代码和源码写的和shi一样,也可能是我水平不够,理解不了(狗头)
我写了个工具类可以直接使用,生产环境谨慎使用

import com.jcraft.jsch.*;
import java.io.InputStream;

public class ShellUtil {
    private final Session session;

    public ShellUtil(String host, String user, String password, int port) throws JSchException {
        this.session = new JSch().getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("PreferredAuthentications", "password"); //首选通过密码进行身份认证,否则建立连接会花费很久
        session.setConfig("StrictHostKeyChecking", "no");          //不进行严格的主机密钥检查
    }

    public String exec(String command) throws Exception {
        session.connect();
        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        channel.setInputStream(null);
        ((ChannelExec) channel).setErrStream(System.err);
        InputStream in = channel.getInputStream();
        // Exec thread 启动
        channel.connect(10000);
        //有些 command 可能执行很长时间, 读取执行结果时需要等待
        StringBuilder res = new StringBuilder();
        byte[] tmp = new byte[1024];
        while (in.available() > 0 || !channel.isClosed()) {
            if (!channel.isClosed()) Thread.sleep(200);
            res.append(new String(tmp, 0, in.read(tmp, 0, 1024)));
        }
        channel.disconnect();
        session.disconnect();
        return res.toString();
    }

    public static void main(String[] args) throws Exception {
        ShellUtil shellUtil = new ShellUtil("server", "root", "root", 22);
        System.out.println(shellUtil.exec("docker ps"));
    }
}

我写的代码也和shi一样,请大佬多指教

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐