• 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

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.53</version>
    </dependency>

    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:UsersAdministratorDesktop ��Ŀ¼  2017/02/22  16:28    <DIR>          . 2017/02/22  16:28    <DIR>          .. 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] Java实践 — SSH远程执行Shell脚本

    [2] JSch基本使用

  • 相关阅读:
    Django:重定向
    Django:使用get_template、render实现读取数据并传递数据
    Django:读入html中的数据
    Django:urls配置路由地址
    Django:基础知识-创建模块
    HTMLTestRunner美化
    python2 selenium
    Jmeter检查点
    Jmeter集合点
    jmeter的三种参数化方式
  • 原文地址:https://www.cnblogs.com/Ming8006/p/6438844.html
Copyright © 2020-2023  润新知