JSch远程执行脚本
2017-02-24
在自动化测试的时候,需要远程操控服务器做一些操作,比如切日、起服务器、执行某些脚本。如何实现?
我们可以利用JSch,远程执行脚本。JSch是Java Secure Channel的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包:。
以下是实现代码通过JSch远程Windows系统和Linux系统执行脚本。其中Windows系统需要安装freeSSHd,具体步骤可查看。
1 pom.xml
com.jcraft jsch 0.1.53
2 SshUtil.java
package test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;public class SshUtil { public static String exec(String host, String user, String psw, int port, String command) { String result = ""; Session session = null; ChannelExec openChannel = null; try { JSch jsch = new JSch(); // getSession()只是创建一个session,需要设置必要的认证信息之后,调用connect()才能建立连接。 session = jsch.getSession(user, host, port); java.util.Properties config = new java.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 = new BufferedReader( new InputStreamReader(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(); } } return result; }}
3 Client.java
package test;public class Client { public static void main(String[] args) { ExecuteCmdOnWin(); } private static void ExecCmdOnLinux() { 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 void ExecuteCmdOnWin() { 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("切日操作失败,请查找原因"); } }}
4 结果
4.1 Window
系统执行的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:\Users\Administrator\Desktop ��Ŀ¼ 2017/02/22 16:28. 2017/02/22 16:28 .. 2017/02/14 10:32 1,911 360��ȫ�����7.lnk 2016/09/22 17:46 1,047 Excel 2007.lnk 2017/02/22 16:28 948 FreeSSHd.lnk 2016/09/22 17:46 1,066 PowerPoint 2007.lnk 2016/09/22 17:46 1,059 Word 2007.lnk 2016/09/22 20:42 2,064 �����.lnk 2017/02/14 10:33 2,255 ������PPS.lnk 2017/01/24 10:16 993 װ���ر�.lnk 2017/02/14 10:32 1,913 �ṷ����.lnk 9 ���ļ� 13,256 �ֽ� 2 ��Ŀ¼ 76,647,092,224 �����ֽ�
4.2 Linux
系统执行的CMD命令是:"[ls]"-1 tmpfolder 公共的 模板 视频 图片 文档 下载 音乐 桌面
5 参考
[1]
[2]