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,不同的操作啦。