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,向 ...
随机推荐
- 老男孩linux实训学生入学资格考试题(技术部分)
################################################################ 本文内容摘录于老男孩linux实战运维培训中心入学考试题(答案部分) ...
- Linux-非结构化数据同步-Linux下Rsync+Rsync实现非结构化增量差异数据的同步2
说明: 操作系统:CentOS 5.X 源服务器:192.168.21.129 目标服务器:192.168.21.127,192.168.21.128 目的:把源服务器上/home/www.osyun ...
- C语言学习笔记 (008) - C语言字符串操作总结大全(超详细)(转)
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...
- 【转】25.windbg-!gle、g(错误码、g系列)
!gle !gle 扩展显示当前线程的最后一个错误码.这个太好记了,getlasterror取首字母: <span style=:> !gle LastErrorValue: (Win32 ...
- openstack rpc机制
一.概述: 在openstack项目中,api的调用规则: 跨项目:如nova调用keystone, glance,cinder等,使用rest api(通过相应的python-XXXclient 库 ...
- Windows 重装系统-用户转移User和Program Files 文件夹
原文地址:https://blog.csdn.net/sinat_38799924/article/details/74059037 重装系统时为了让系统数据保持可用我们需要做一些备份处理.比如用户数 ...
- ORA-01917: user or role 'PDB_DBA' does not exist
在使用seed PDB创建新的PDB的时候,报了以下错误提示: SQL> create pluggable database pdb2 admin user admin1 identified ...
- cassandra java 兼容性问题及其解决方法
1.安装 http://wiki.apache.org/cassandra/DebianPackaging 2.java兼容性问题 由于cassandra运行于sun jdk6上,而ubuntu默认是 ...
- HttpWebRequest、HttpWebResponse、HttpClient、WebClient等http网络访问类的使用示例汇总
工作中长期需要用到通过HTTP调用API以及文件上传下载,积累了不少经验,现在将各种不同方式进行一个汇总. 首先是HttpWebRequest: /// <summary> /// 向服务 ...
- hibernate的hql查询语句总结
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...