如何實現通過JAVA遠端執行重啟tomcat操作?

盧水發發表於2020-02-24

1、加入jcraft的包

<dependency>
          <groupId>com.jcraft</groupId>
          <artifactId>jsch</artifactId>
          <version>0.1.54</version>
      </dependency>
複製程式碼

2、程式碼實現類

public class SSHCommandExecutor {
    private String ipAddress;

    private String username;

    private String password;

    public static final int DEFAULT_SSH_PORT = 22;

    private Vector<String> stdout;

    public SSHCommandExecutor(final String ipAddress, final String username, final String password) {
        this.ipAddress = ipAddress;
        this.username = username;
        this.password = password;
        stdout = new Vector<String>();
    }

    public int execute(final String command) {
        int returnCode = 0;
        JSch jsch = new JSch();

        try {
            // Create and connect session.
            Session session = jsch.getSession(username, ipAddress, DEFAULT_SSH_PORT);
            session.setPassword(password);
            //session.setUserInfo(userInfo);

            Properties config = new Properties();

            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);

            session.connect();

            // Create and connect channel.
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);

            channel.setInputStream(null);
            BufferedReader input = new BufferedReader(new InputStreamReader(channel
                    .getInputStream()));

            channel.connect();
            System.out.println("The remote command is: " + command);

            // Get the output of remote command.
            String line;
            while ((line = input.readLine()) != null) {
                stdout.add(line);
            }
            input.close();

            // Get the return code only after the channel is closed.
            if (channel.isClosed()) {
                returnCode = channel.getExitStatus();
            }

            // Disconnect the channel and session.
            channel.disconnect();
            session.disconnect();
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnCode;
    }

    public Vector<String> getStandardOutput() {
        return stdout;
    }
複製程式碼

3、執行示例(重啟遠端機器的tomcat)

public static void main(final String[] args) {
        SSHCommandExecutor sshExecutor = new SSHCommandExecutor("伺服器IP", "使用者名稱", "密碼");
        //1 停止tomcat
        sshExecutor.execute("/usr/java/apache-tomcat-8.5.32/bin/shutdown.sh");
        //2 開啟tomcat
        sshExecutor.execute("/usr/java/apache-tomcat-8.5.32/bin/startup.sh");
        Vector<String> stdout = sshExecutor.getStandardOutput();
        for (String str : stdout) {
            System.out.println(str);
        }
    }
複製程式碼

常用的遠端執行通道

常用的有三種通道,即ChannelShell、ChannelExec、ChannelSftp,前兩類用於執行命令(命令可以是shell語句,也可以是python  xxx.py),後一種是用於上傳下載檔案。

ChannelShell和ChannelExec的區別: 前者是互動式的,在channel.connect()之前,需要獲取outputStream和inputStream,然後outputstream傳送命令,從instream中讀取命令的結果(注意,傳送命令之後,讀取命令之前要等待一會兒,一般需要寫個迴圈判斷,每秒讀一次,根據實際情況設定xx秒超時退出),但是有個壞處是,它執行就像登陸到vm上列印的資訊一樣,無論執行命令後的任何資訊,它都會通過instream返回到客戶端來,而你可能僅僅需要命令執行後的結果;於是就有了後者,非互動的,一次通道執行一條命令(當然如果你組合的好,也可以多條,反正就是一個字串,一次互動,偷偷的告訴你,這一個python指令碼,下發的命令去執行這個指令碼,可以做好多好多事情哦),好處是,它返回的資訊非常乾淨,只返回標準輸出,標準錯誤是不返回的,這時你可以利用python的print,正確時你print正確資訊,錯誤時print錯誤資訊,客戶端都能獲取到結果啦(因為print是標準輸出)。

使用步驟:

1、new一個JSch物件;

2、從JSch物件中獲取Session,用於連線,並設定連線資訊(根據SSH的連線原理,有兩種方式,一是使用者名稱+密碼,二是使用者名稱+privatekey+passphrase,第二種方式要在第1步設定,即jsch.addIdentity(xxx));

3、使用session物件呼叫opnChannel("xxx")開啟通訊通道,並連線;

4、後面就是不同的channel,不同的操作啦。

相關文章