设为首页 收藏本站
查看: 917|回复: 0

[经验分享] Nginx测试中如何实现远程执行程序

[复制链接]

尚未签到

发表于 2016-12-28 08:36:50 | 显示全部楼层 |阅读模式
  需求:
  在进行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测试中如何实现远程执行程序的说明。希望能帮助其他测试工程师更高效的完成工作。 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-320392-1-1.html 上篇帖子: Nginx的location匹配规则和全局变量 下篇帖子: Nginx源码完全注释(5)core/ngx_cpuinfo.c
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表