1. 程式人生 > 其它 >Java 使用SSH協議連線到遠端Shell執行指令碼

Java 使用SSH協議連線到遠端Shell執行指令碼

使用Jsch編寫一個可以向遠端主機執行指令碼的工具類

使用場景
有時候我們希望對某伺服器進行一定的操作但又不想在上邊裝一個服務端程式
解決方案
我找了一些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 (!channel.isClosed() || in.available() > 0) {
            res.append(new String(tmp, 0, in.read(tmp, 0, 1024)));
            if (!channel.isClosed()) Thread.sleep(200);
        }
        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一樣,請大佬多指教