java jsch執行腳本_JSch遠端執行腳本

JSch遠端執行腳本

2017-02-24

在自動化測試的時候,需要遠端操控伺服器做一些操作,例如切日、起伺服器、執行某些腳本。如何實現?

我們可以利用JSch,遠端執行腳本。JSch是Java Secure Channel的縮寫,是一個SSH2功能的純Java實現,具體訊息可以參考JSch官網。它允許你連接到一個SSH伺服器,並且可以使用連接埠轉發,X11轉發,檔案傳輸等,同時你也可以整合它的功能到你自己的應用程式。在使用前,需要下載並匯入JSch包:jsch-0.1.50.jar。

以下是實現程式碼透過JSch遠端Windows系統和Linux系統執行腳本。其中Windows系統需要安裝freeSSHd,具體步驟可檢視終端模擬工具:Xshell 4。

1 pom.xml

com.jcraft

jsch

0.1.53

2 SshUtil.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagetest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importcom.jcraft.jsch.ChannelExec;importcom.jcraft.jsch.JSch;importcom.jcraft.jsch.JSchException;importcom.jcraft.jsch.Session;public classSshUtil {public static String exec(String host, String user, String psw, intport, String command) {

String result= "";

Session session= null;

ChannelExec openChannel= null;try{

JSch jsch= newJSch();//getSession()只是建立一個session,需要設定必要的認證訊息之後,呼叫connect()才能建立連線。

session =jsch.getSession(user, host, port);

java.util.Properties config= newjava.util.Properties();

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

session.setConfig(config);

session.setPassword(psw);

session.connect();//呼叫openChannel(String type)//可以在session上開啟指定型別的channel。該channel只是被初始化,使用前需要先呼叫connect()進行連接。//Channel的型別可以為如下型別://shell - ChannelShell//exec - ChannelExec//direct-tcpip - ChannelDirectTCPIP//sftp - ChannelSftp//subsystem - ChannelSubsystem//其中,ChannelShell和ChannelExec比較類似,都可以作為執行Shell腳本的Channel型別。它們有一個比較重要的區別:ChannelShell可以看作是執行一個互動式的Shell,而ChannelExec是執行一個Shell腳本。

openChannel = (ChannelExec) session.openChannel("exec");

openChannel.setCommand(command);int exitStatus =openChannel.getExitStatus();

System.out.println(exitStatus);

openChannel.connect();

InputStream in=openChannel.getInputStream();

BufferedReader reader= newBufferedReader(newInputStreamReader(in));

String buf= null;while ((buf = reader.readLine()) != null) {

result+= " " +buf;

}

}catch(JSchException e) {

result+=e.getMessage();

}catch(IOException e) {

result+=e.getMessage();

}finally{if (openChannel != null && !openChannel.isClosed()) {

openChannel.disconnect();

}if (session != null &&session.isConnected()) {

session.disconnect();

}

}returnresult;

}

}

View Code

3 Client.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagetest;public classClient {public static voidmain(String[] args) {

ExecuteCmdOnWin();

}private static voidExecCmdOnLinux() {

String ip= "xxx.xxx.xxx.xxx";int port = 22;

String user= "username";

String pwd= "password";

String batCommand= "ls";try{

System.out.println("系統執行的CMD命令是:"[" + batCommand + "]"");

System.out.println(SshUtil.exec(ip, user, pwd, port, batCommand));

Thread.sleep(1000);

Thread.sleep(1000);

}catch(Exception e) {

System.out.println("切日操作失敗,請搜尋原因");

}

}private static voidExecuteCmdOnWin() {

String ip= "xxx.xxx.xxx.xxx";int port = 22;

String user= "username";

String pwd= "password";

String batCommand= "cmd /c "start " + "C:/createFolder.bat" + """;//執行批處理,會開啟一個cmd視窗,這裡會執行命令kill cmd.exe 行程

String killCMD = "cmd /c "taskkill /f /fi "IMAGENAME eq cmd.exe""";

String updatedatecommand= "cmd /c "date " + "2017/2/24";

String dirCommand= "cmd /c dir";try{

System.out.println("系統執行的CMD命令是:"[" + batCommand + "]"");

System.out.println(SshUtil.exec(ip, user, pwd, port, batCommand));

System.out.println("系統執行的CMD命令是:"[" + killCMD + "]"");

System.out.println(SshUtil.exec(ip, user, pwd, port, killCMD));

System.out.println("系統執行的CMD命令是:"[" + updatedatecommand + "]"");

System.out.println(SshUtil.exec(ip, user, pwd, port,updatedatecommand));

System.out.println("系統執行的CMD命令是:"[" + dirCommand + "]"");

System.out.println(SshUtil.exec(ip, user, pwd, port, dirCommand));

}catch(Exception e) {

System.out.println("切日操作失敗,請搜尋原因");

}

}

}

View Code

4 結果

4.1 Window

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

系統執行的CMD命令是:"[cmd /c "start C:/createFolder.bat"]"

-1

系統執行的CMD命令是:"[cmd /c "taskkill /f /fi "IMAGENAME eq cmd.exe""]"

-1

???: ????? PID ? 3444 ?????? ???: ????? PID ? 2860 ?????? ???: ????? PID ? 2980 ??????

系統執行的CMD命令是:"[cmd /c "date 2017/2/24]"

-1

系統執行的CMD命令是:"[cmd /c dir]"

-1

?????? C ?е????б???? ??????к??? 3C69-84C5 C:UsersAdministratorDesktop ???? 2017/02/22 16:28

View Code

4.2 Linux

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

系統執行的CMD命令是:"[ls]"

-1

tmpfolder 公共的 模板 影片 圖像 檔案 下載 音樂 桌面

View Code

5 參考