最近收到一个测试任务,其中性能部分涉及到ssh的并发测试。经过简单调研,找到了一个现成的 jar包“JSch”。JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。而loadrunner的java vuser支持直接导入现有jar包,调用其中的方法。所以,就确定了loadrunenr java vuser+jsch的方式来实现shh的并发在线测试。测试的主要关注点是探测当前服务配置下的最大ssh并发连接数(连接是从A机ssh连接登陆B机后在跳转C机,并在跳转成功后按一定 时间间隔持续执行操作命令)。感觉loadruner java vuser还是蛮方便的,用途也挺广,大家有兴趣不妨了解一下。不费话了,下面是测试脚本:
/*
* LoadRunner Java script. (Build: _build_number_)
*
* Script Description:
*
*/
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import com.jcraft.jsch.*;
import lrapi.lr;
public class Actions
{
String mUserName = "*******";
String mHostName = "***.***.***.***";
String mPwd = "*******";
public int init() throws Throwable {
return 0;
}//end of init
public int action() throws Throwable {
lr.start_transaction("ssh jump");
try{
//配置登陆B机的用户名密码、IP地址
JSch jsch=new JSch();
Session session=jsch.getSession("mUserName, mHostName, 22);
session.setPassword(mPwd );
session.setConfig("StrictHostKeyChecking", "no");
try {
//建立连接
session.connect(50000);
} catch (Exception e) {
System.out.println(e);
return 1;
}
Channel channel = session.openChannel("shell");
OutputStream outS = channel.getOutputStream();
PrintStream commander = new PrintStream(outS, true);
Thread.sleep(1000);
channel.setOutputStream(System.out);
channel.setInputStream(System.in);
channel.connect(10 * 1000);
Thread.sleep(1000);
InputStream instream = channel.getInputStream();
while(true){
int reconnect=0;
commander.println("ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -t -t rdtest@<mserver> ");
Thread.sleep(5000);
/*将回显打印输出*/
/***********************************************************************************************/
if (instream.available() > 0) {
byte[] data = new byte[instream.available()];
int nLen = instream.read(data);
if (nLen < 0) {
throw new Exception("network error.");
}
//转换输出结果并打印出来
String temp = new String(data, 0, nLen,"iso8859-1");
System.out.println(temp);
//预期字符串在temp中的位置,可以据此判断跳转是否成功。
System.out.println(temp.indexOf("Last login:"));
//如果跳转成功,则跳出跳转循环,开始执行下面的shell指令
if (temp.indexOf("Last login:")!=-1) {
break;
}
Thread.sleep(5000);
reconnect++;
if (reconnect>5) {
lr.end_transaction("ssh jump", lr.FAIL);
lr.message("尝试5次跳转失败,任务结束");
return 1;
}
}
}
/***********************************************************************************************/
while (1>0) {
commander.println("ifconfig");
Thread.sleep(5000);
/***********************************************************************************************/
if (instream.available() > 0) {
byte[] data = new byte[instream.available()];
int nLen = instream.read(data);
if (nLen < 0) {
throw new Exception("network error.");
}
//转换输出结果并打印出来
String temp = new String(data, 0, nLen,"iso8859-1");
if (temp.indexOf("command not found")!=-1) {
lr.end_transaction("ssh jump", lr.FAIL);
lr.message("堡垒机器与被管理机连接中断,任务结束");
return 1;
}
System.out.println(temp);
}
/***********************************************************************************************/
for (int i=0;i<5;i++) {
commander.println("ls");
Thread.sleep(1000);
/***********************************************************************************************/
if (instream.available() > 0) {
byte[] data = new byte[instream.available()];
int nLen = instream.read(data);
if (nLen < 0) {
throw new Exception("network error.");
}
//转换输出结果并打印出来
String temp = new String(data, 0, nLen,"iso8859-1");
System.out.println(temp);
}
/***********************************************************************************************/
}
}
}catch(Exception e){
System.out.println(e);
lr.end_transaction("ssh jump", lr.FAIL);
lr.message("任务结束"+e.toString());
return 1;
}
//return 0;
}//end of action
/* public int end() throws Throwable {
return 0;
}//end of end*/
}