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;
}
}
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 <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 �����ֽ�
4.2 Linux
系统执行的CMD命令是:"[ls]"
-1
tmpfolder 公共的 模板 视频 图片 文档 下载 音乐 桌面
5 参考
[2] JSch基本使用
JSch远程执行脚本的更多相关文章
- SSH 无密码远程执行脚本
		
ssh无密码登录及远程执行脚本要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS7为例. 测试环境:机器A(10.0.224.80):机器B(192.16 ...
 - jenkins远程执行脚本时报Bad version number in .class file
		
这几天在学习jenkins的持续集成和部署,到了最后一步启动服务的时候,遇到了一个这个Bad version number in .class file的报错(如下图). 这个报错在最开始手工部署的时 ...
 - Ansible 远程执行脚本
		
1. 先在服务端创建一个 shell 脚本 [root@localhost ~]$ cat /tmp/test.sh #!/bin/bash echo "hello world" ...
 - SSH非交互式密码授权远程执行脚本
		
公司有上百台服务器,需要为每台服务器都执行一个脚本,因为所有服务器的账号密码都是一样的,所以可以不用搭建ansible等自动化运维工具,我们直接通过SSH远程执行即可完成. 本文以三台服务器为例,系统 ...
 - Linux远程无密码登陆并远程执行脚本
		
假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机: 要达到的目的: A机器ssh登录B机器无需输入密码: 加密方式选 rsa|dsa均可以,默认dsa ss ...
 - Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
		
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
 - [问题排查]通过调度系统远程执行脚本,报mysql command not found异常
		
今天在公司使用LS调度系统(百度内部的工具),执行远程脚本的时候,每次都失败. 脚本内容比较简单,其实就是将HDFS(AFS)中的数据插入到Palo(Doris)数据库中,脚本如下: mysql -h ...
 - Ansible远程执行脚本示例
		
首先创建一个shell脚本 cat /tmp/df.sh #!/bin/bash df -h|grep vda|awk '{print $5}' 然后把该脚本分发到各个机器上 ansible comp ...
 - CentOS 通过 expect 批量远程执行脚本和命令
		
我们有时可能会批量去操作服务器,比如批量在服务器上上传某个文件,安装软件,执行某个命令和脚本,重启服务,重启服务器等,如果人工去一台台操作的话会特别繁琐,并浪费人力. 这时我们可以使用expect,向 ...
 
随机推荐
- java 获取计算机名称, ip, mac地址
			
写在前面 通常所说查询本机mac地址是以以太网为准的, 也就是网线那个口..这种描述略捞. 但是通过java的getHostAddress获取ip以及getHardwareAddress()方法获取m ...
 - NFS安装及优化过程--centos6.6
			
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
 - 【Java】详解java对象的序列化
			
目录结构: contents structure [+] 序列化的含义和意义 使用对象流实现序列化 对象引用的序列化 自定义序列化 采用实现Serializable接口实现序列化 采用实现Extern ...
 - /struts-tags not found ,/struts-dojo-tags not found 上线后异常解决方案
			
上线到2003上后发现2个问题:1 缺少/struts-tags2 缺少/struts-dojo-tags在xp上不用直接指定这些文件的位置,但在其他的系统可能无法自动找到它的路径,一定要明确指定在w ...
 - MongoDB学习笔记(7)--- 条件操作符
			
描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. 在本章节中,我们将讨论如何在MongoDB中使用条件操作符. MongoDB中条件操作符有: (>) 大于 - $gt (& ...
 - 'Agent XPs' component is turned off as part of the security configuration for this server
			
To turn on Agent XP's by running this script: sp_configure 'show advanced options', 1; Go RECONFIGUR ...
 - SharePoint中在线编辑文档
			
我一直以为只有在Document Library里面的File才会支持在线编辑.直到今天早上我才发现用IE打开List里面的Attachments也是支持在线编辑的,但前提是必须是IE浏览器. 目前正 ...
 - struts系列:返回json格式的响应
			
一.增加依赖库 // https://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin compile group: ' ...
 - SLA等级那些9的实际意义
			
1. 重要的系统起码要设计达到99.9%的可靠性吧. 俗称3个9,这是什么意思呢? (1-99.9%)*365*24=8.76小时,表示该软件系统在连续运行1年时间里最多可能的业务中断时间是8.76小 ...
 - labview程序性能优化
			
课时15: 中级08:LabVIEW运行性能(作者:NI应用工程师 李甫成) 一.避免强制类型转换 二.防止内存泄漏 三.将vi的一部分转化为子vi 四轴项目中所占内存对比,变为子vi后执行速度也快了 ...