博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSch远程执行脚本
阅读量:7113 次
发布时间:2019-06-28

本文共 5801 字,大约阅读时间需要 19 分钟。

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;    }}
View Code

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("切日操作失败,请查找原因");        }    }}
View Code

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 �����ֽ�
View Code

4.2 Linux

系统执行的CMD命令是:"[ls]"-1 tmpfolder 公共的 模板 视频 图片 文档 下载 音乐 桌面
View Code

5 参考

[1]

[2]

 

转载于:https://www.cnblogs.com/Ming8006/p/6438844.html

你可能感兴趣的文章
微信支付 V3版
查看>>
Linux与JVM的内存关系分析
查看>>
详解SpringMVC中Controller的方法中参数的工作原理——基于maven
查看>>
flask+mako+peewee(下)(解决了Error 2006: MySQL server has gone away)
查看>>
接口测试的工具
查看>>
error log
查看>>
innerHTML引起IE的内存泄漏
查看>>
转化率不好?告诉你转化飙秘诀
查看>>
Class.forName()用法详解
查看>>
Linux内核实践之工作队列【转】
查看>>
一个简单得不能再简单的“ORM”了
查看>>
交叉验证 Cross-validation
查看>>
压力测试就是一种破坏性的性能测试
查看>>
开发环境、生产环境、测试环境的基本理解和区别(转)
查看>>
angularjs学习曲线
查看>>
关于Cocos2d-x中对其他某个类的某个属性的获得
查看>>
多进程多线程优先级理解--优先级反转【转】
查看>>
BZOJ 3343: 教主的魔法 分块
查看>>
秋招笔试碰到的疑难题目1
查看>>
Zookeeper WINDOWS 安装配置
查看>>