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 参考

[1] Java实践 — SSH远程执行Shell脚本

[2] JSch基本使用

JSch远程执行脚本的更多相关文章

  1. SSH 无密码远程执行脚本

    ssh无密码登录及远程执行脚本要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS7为例. 测试环境:机器A(10.0.224.80):机器B(192.16 ...

  2. jenkins远程执行脚本时报Bad version number in .class file

    这几天在学习jenkins的持续集成和部署,到了最后一步启动服务的时候,遇到了一个这个Bad version number in .class file的报错(如下图). 这个报错在最开始手工部署的时 ...

  3. Ansible 远程执行脚本

    1. 先在服务端创建一个 shell 脚本 [root@localhost ~]$ cat /tmp/test.sh #!/bin/bash echo "hello world" ...

  4. SSH非交互式密码授权远程执行脚本

    公司有上百台服务器,需要为每台服务器都执行一个脚本,因为所有服务器的账号密码都是一样的,所以可以不用搭建ansible等自动化运维工具,我们直接通过SSH远程执行即可完成. 本文以三台服务器为例,系统 ...

  5. Linux远程无密码登陆并远程执行脚本

    假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机: 要达到的目的: A机器ssh登录B机器无需输入密码: 加密方式选 rsa|dsa均可以,默认dsa ss ...

  6. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  7. [问题排查]通过调度系统远程执行脚本,报mysql command not found异常

    今天在公司使用LS调度系统(百度内部的工具),执行远程脚本的时候,每次都失败. 脚本内容比较简单,其实就是将HDFS(AFS)中的数据插入到Palo(Doris)数据库中,脚本如下: mysql -h ...

  8. Ansible远程执行脚本示例

    首先创建一个shell脚本 cat /tmp/df.sh #!/bin/bash df -h|grep vda|awk '{print $5}' 然后把该脚本分发到各个机器上 ansible comp ...

  9. CentOS 通过 expect 批量远程执行脚本和命令

    我们有时可能会批量去操作服务器,比如批量在服务器上上传某个文件,安装软件,执行某个命令和脚本,重启服务,重启服务器等,如果人工去一台台操作的话会特别繁琐,并浪费人力. 这时我们可以使用expect,向 ...

随机推荐

  1. 【DeepLearning】Exercise:Softmax Regression

    Exercise:Softmax Regression 习题的链接:Exercise:Softmax Regression softmaxCost.m function [cost, grad] = ...

  2. RFID-RC522 与Arduino的连接

    一.前几天在某宝上刚买了个RFID-RC522  ,目标是复制我的门禁卡(看样子没多大希望了).二.各种百度各种谷歌都没找到与Arduino的连接方式. so,分享下我的连接方式,与大家共同进步... ...

  3. bootstrap-datepicker限定可选时间范围

    此项目是 bootstrap-datetimepicker 项目 的一个分支,原项目不支持  Time 选择. 其它部分也进行了改进.增强,例如 load 过程增加了对 ISO-8601 日期格式的支 ...

  4. struts2 jsp ueditor 上传图片失败,获取不到值,解决方法

    struts2 ueditor 上传图片获取不到值 有点奇怪的是:涂鸦,网络的图片都可以.就是本地上传不行.(应该是struts2过滤了部分本地上传的信息,导致失败) 在进入到imageUp.jsp中 ...

  5. win8 应用商店程序使用SQLITE数据库

    http://www.cnblogs.com/zhuzhenyu/archive/2012/11/27/2790193.html using SQLite; using System; using S ...

  6. Linux中用户及用户组

    Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.nobody.ftp等,这些也都是非root用户,即普通用户.Linux的权限实际是上不同用 ...

  7. 更改 AWS RDS mysql时区 -摘自网络

    AWS RDS AWS上搭建数据库的时候,不是DB on EC2就是RDS,但是选择RDS时,Timezone怎么处理? 「面向全球提供的AWS来讲理所当然的是UTC」,而RDS也不是例外.把服务器迁 ...

  8. Android 加载大图

    在 Android 开发中, Bitmap 是个吃内存大户,稍微操作不当就会 OOM .虽然现在第三方的图片加载库已经很多,很完善,但是作为一个 Androider 还得知道如何自己进行操作来加载大图 ...

  9. go 从入门到精通(二)基本数据类型和操作符

    一.文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置别名 下面是保留关键字: ...

  10. jQuery添加/改变/移除CSS类

    转自:http://www.jbxue.com/article/24589.html 在jquery中用到removeClass移除CSS类.addClass添加CSS类.toggleClass添加或 ...