需求:
在进行Nginx测试的过程中,经常需要对远程服务器执行一些shell脚本、应用程序或系统命令。一般简单的方法是将测试代码放到所需的远程服务器上来运行,或者使用staf框架来协助远程执行。
但我个人认为,staf框架比较适合用于执行sudo权限的命令,而且他对服务器环境有一些额外的要求,比如远程服务器和本机均必须安装staf,而且执行输出结果也不是很清晰。
那有没有轻量级的远程执行方法,并且能将执行结果完整的输出呢?在这里要感谢我以前的同事:一环同学,是他提供了这个宝贵的经验,采用JAVA源码提供的工具: ch.ethz.ssh2
解决方案:
首先介绍ch.ethz.ssh2的一些方法:
1. ch.ethz.ssh2.Connection:
Connection对象,用于与一台SSH-2 服务器建立加密的TCP/IP连接;
2. authenticateWithPassword方法:
在连接建立成功之后,向远程服务器发起认证。该方法通过用户名+密码的方式来进行验证。
如果验证阶段完成,将会返回true。如果远程服务器拒绝请求或者需要进一步的验证操作,则返回false。
3. openSession方法:
在连接建立完成且验证通过之后,打开一个新的会话用于后续的程序执行操作。tips:一个连接可以打开多个会话。
4. ch.ethz.ssh2.Session:
会话对象,是用于执行远程程序的。这个程序包含了shell脚本、应用程序、系统命令。tips:多个会话可以同步执行。
5. execCommand方法:
用于在远程服务器上执行命令。
6. startShell方法:
用于在远程服务器上启动shell脚本。
还有其他对象和方法在这里先不进行介绍,大家有兴趣可以参见开源文档或代码——http://www.java2s.com/Open-Source/Java-Document/Net/Ganymed-SSH-2/ch/ethz/ssh2
其次介绍使用这些方法的代码实现:
/**
* @author gongyuan.cz
*/
public class HelpProc {
private static Connection conn;
private static Session session;
// 建立本机与远程机器之间的连接及验证关系
// ShellServer对象内包含远程主机IP地址,用于操作远程程序的帐号及密码
private static void initSession(ShellServer server) throws IOException {
// 建立本机与远程服务器的连接
conn = new Connection(server.getHost());
conn.connect();
// 在该连接上建立验证关系
boolean success = conn.authenticateWithPassword(server.getUsername(),
server.getPassword());
// 通过Junit来验证验证关系是否通过
Assert.assertTrue("ssh远程服务器失败", success);
// 验证关系通过之后,建立本机与远程服务器的会话
session = conn.openSession();
}
// 执行远程服务器的程序
// ShellServer在上面介绍过
// cmd传入所要执行的命令
// expectStdout是预期该命令执行后的正常输出结果
// expectStderr是预期命令执行后的错误输出结果
public static void executeRemoteCommand(ShellServer server, String cmd,
String expectStdout, String expectStderr) throws Exception {
// 建立连接创建会话
initSession(server);
// 通过会话在远程服务器上执行命令
session.execCommand(cmd);
// 通过BufferedReader获取会话的正常输出结果
BufferedReader stdout = new BufferedReader(new InputStreamReader(session.getStdout()));
try {
String line = stdout.readLine();
StringBuffer sb = new StringBuffer();
while (line != null) {
sb.append(line);
line = stdout.readLine();
}
// 此处可以设置输出远程服务器执行命令后的所有正常输出结果,便于测试人员在本地调试代码
System.out.println(sb.toString());
// 此处验证远程服务器执行命令后的正常输出结果与我们的预期结果是否一致
Assert.assertEquals("内容不匹配", true,sb.toString().contains(expectStdout));
} catch (IOException e) {
e.printStackTrace();
}
// 通过BufferedReader获取会话的错误输出结果
BufferedReader stderr = new BufferedReader(new InputStreamReader(session.getStderr()));
try {
String line = br2.readLine();
StringBuffer sb = new StringBuffer();
while (line != null) {
sb.append(line);
line = br2.readLine();
}
// 此处可以设置输出远程服务器执行命令后的所有错误输出结果,便于测试人员在本地调试代码
System.out.println(sb.toString());
// 此处验证远程服务器执行命令后的错误输出结果与我们的预期结果是否一致
Assert.assertEquals("内容不匹配", true,sb.toString().contains(expectStderr));
} catch (IOException e) {
e.printStackTrace();
}
// 此处会block住直到SSH2的某种状态返回
session.waitForCondition(ChannelCondition.EXIT_STATUS, 0);
// 返回远程命令执行结束的状态码,与Staf的返回码作用一致
int status = session.getExitStatus();
// 输出状态码便于测试人员调试代码
System.out.println("exit_code=" + status);
// 最后关闭会话和连接
session.close();
conn.close();
}
}
最后是代码执行及结果展示:
所执行的代码:
String cmd = "cat " + "/home/admin/test.txt";
HelpProc.executeRemoteCommand(SERVER, cmd, "test file", "");
上述代码执行后输出结果 写道
cat /home/admin/test.txt
test file
exit_code=0
ok,以上就是Nginx测试中如何实现远程执行程序的说明。希望能帮助其他测试工程师更高效的完成工作。
分享到:
相关推荐
nginx +lua 实现 访问远程地址 下载文件 环境配置: 启动tomcat 把要下载的文件放到跟目录比如:pdf zip 等 启动nginx 访问nginx lua 打开socket 访问tomcat 文件路径,并下载到本地
linux 32位系统下nginx可以执行程序,支持rtmp推流,拉流
nginx针对syslog的补丁
使用nginx+eureka实现微服务的高负载均衡,提高网站的访问性能
nginx-tomcat整合实现JAVA程序负载均衡
Nginx应用案例分享:压力测试,Nginx测试,Nginx压力测试
Windows下Nginx配置SSL实现Https访问(包含证书生成)
Nginx实现MYSQL主备高可用双活Nginx实现MySQL主备高可用双活Nginx实现MYSQL主备高可用双活Nginx实现MYSQL主备高可用双活Nginx实现MYSQL主备高可用双活
nginx四层代理测试 及SLB负载均衡功能配置测试
NGINX + LUA实现复杂的控制
awk测试从nginx查询qps的测试日志
linux 的nginx打包好的程序,可以直接运行。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:...
此资源为在windows环境下编译包含rtmp功能的nginx可执行程序,所有的源码依赖包都包含在其中。考虑到压缩包体积太大,所以把依赖库源码删除了,编译之前需要重新解压到源码下。 需仔细阅读README.md说明文档。 详细...
1、ab 测试工具安装 2、wrk测试工具 1、系统和nginx是否可以建立多个socket连接 2、系统和nginx是否允许一次性打开多个文件 1、http连
主要是实现单点登录,session共享,利用redis缓存。使用的技术是nginx+redis。为了避免麻烦,未使用任何框架。
nginx代码示例,里面有7部代码示例,另外有一个供新人学习观看的链接,欢迎下载~
此数据为go语言收集nginx容器日志,测试数据,方便代码的测试。另外我还会在文章中放入自写的数据生成代码,方便数据的产生。
Nginx的安装实现web功能,包含实现安装 调试 使用
Nginx+tomcat 实现负载均衡session共享demo,和http://blog.csdn.net/u014513883/article/details/48550709 类似
Nginx下实现对cxf WebService的负载均衡。