Java远程执行linux命令

之前在工作中做压力测试的时候,需要不断去给系统所在服务器制造压力,看系统什么时候会挂掉,因为给系统制造的压力不是说一下就会让它挂掉,而是需要结合生产环境用和合适的压力去压测,可能是几个小时或者一天,作为测试人员也不是无时无刻盯着服务器,看CPU、看内存、看系统各应用状态,所以就在想着有没有办法在进行压测的同时监控服务器的各个服务状态,有问题了立刻做记录并抛出,这样测试人员就可以释放出来去做别的事,让系统自己在那压着就行,出问题了去看监测的情况,开发的监测工具还能在从系统被压那刻起开始计时,什么时候系统挂了记录下压测时间和此时压测量,用来进行系统性能的分析,一个好的压力测试工具应该具备以下几点:
1.能模拟真实场景;
2.对后台系统进行指标监控;
3.收集测试数据进行分析,找出系统瓶颈。

我的测试环境是基于linux系统,自己在工作中开发的压力测试工具是基于Java编写,需要用到ch.ethz.ssh2下面的Java类,它可以远程执行linux命令并获取命令的返回结果,maven工程通过在pom.xml中引入如下依赖即可使用:

	 <dependency>
			<groupId>ch.ethz.ganymed</groupId>
			<artifactId>ganymed-ssh2</artifactId>
			<version>build210</version>
		</dependency>
    <dependency>

下面记录下Java怎么通过SSH2协议远程执行linux指令。
1.创建连接
Connection conn = new Connection(String ip);//参数传服务器的地址
conn.connect();

2.模拟登录测试服务器,若不能登录则抛异常退出
boolean isAuthenticated=conn.authenticateWithPassword(String username, String password);//返回true代表可正常登录服务器
if(!isAuthenticated) {
System.out.println(“用户名或密码错误”);
throw new IOException(“Authentication failed!”);
}

3.打开一个Session,可用于执行linux命令
Session session=conn.openSession();

4.可用session去执行linux命令了(一般我们需要将执行命令的过程放到一个单独线程内执行)。

//执行linux指令。
session.execCommand(String s);

//StreamGobbler的作用是把session的标准输出包装成InputStream,用于接收目标服务器上的控制台返回结果。
InputStream stdOut=new StreamGobbler(session.getStdout());

//正常IO流读取输入流数据的操作
StringBuffer sb=new StringBuffer();
byte[] bys=new byte[1024];
int len=0;
while((len=stdOut.read(bys))!=-1)  sb.append(new String(bys,0,len));
String res=sb.toString();
System.out.println(res);

//这是接收错误信息
InputStream stdErr=new StreamGobbler(session.getStderr());
sb=new StringBuffer();
bys=new byte[1024];
len=0;
while((len=stdErr.read(bys))!=-1) sb.append(new String(bys,0,len));
String err=sb.toString();
System.out.println("错误是:"+err);

//session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS , 30000);
// 等待,除非1.连接关闭;2.输出数据传送完毕;3.进程状态为退出;4.超时
//调用这个方法在执行linux命令时,会避免环境变量读取不全的问题,这里有许多标识可以用,比如当exit命令执行后或者超过了timeout时间,则session关闭
session.waitForCondition(ChannelCondition.EXIT_STATUS, 3000);//在调用getExitStatus时,要先调用WaitForCondition方法

//一般情况下shell脚本正常执行完毕,getExitStatus方法返回0。 
//此方法通过远程命令取得Exit Code/status。
//但并不是每个server设计时都会返回这个值,如果没有则会返回null。
//getExitStatus的返回值,可以认为是此次执行是否OK的标准。
int ret=session.getExitStatus()==null?0:session.getExitStatus();

5.注意释放资源
if(stdOut!=null) stdOut.close();
if(stdErr!=null) stdErr.close();
if(session!=null) session.close();
if(conn!=null) conn.close();

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值