`
100Continue
  • 浏览: 159764 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Nginx测试中如何实现远程执行程序

阅读更多

需求:

在进行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测试中如何实现远程执行程序的说明。希望能帮助其他测试工程师更高效的完成工作。 

 

 

 

 

2
1
分享到:
评论
1 楼 100Continue 2012-03-19  
因为上面的方法,无法执行sudo命令(需要交互性的输入密码),因此配合Shell脚本就可以很方便的解决该问题:
介绍如下:
在shell脚本中需要用root用的来执行指令:

  sudo 自动输入密码

  echo "password" | sudo -S netstat -tlnp

  -S

  The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.

相关推荐

    海康威视摄像头web端显示方案(Nginx环境测试)

    `start.bat`可能包含了运行Nginx可执行文件(`nginx.exe`)的命令,而`stop.bat`可能包含停止服务的命令,例如发送一个特定信号到Nginx进程。 5. **RunHiddenConsole.exe**: - 这可能是一个辅助程序,用于在后台...

    nginx中文文档

    nginx已经在多个平台上经过测试,包括FreeBSD3—10/i386、FreeBSD5—10/amd64、Linux2.2—3/i386、Linux2.6—3/amd64以及Solaris9/i386。 最后,nginx采用的开源许可证是两条款类BSD协议。文档中提到的nginx中文...

    contos7.9离线安装nginx所需的gcc等.rmp文件

    在Linux系统中,GCC(GNU Compiler Collection)是一个关键的开源编译器套件,用于将源代码编译成可执行程序。在这个特定的场景中,我们关注的是在CentOS 7.9上离线安装Nginx的过程中所必需的GCC及相关依赖。Nginx是...

    centos nginx php mysql 集成

    4. **MySQL**:MySQL 是一个关系型数据库管理系统(RDBMS),广泛用于存储、管理和检索 Web 应用程序中的数据。它是开源的,且性能强大,适合各种规模的项目。 集成这些组件的过程通常包括以下几个步骤: 1. **...

    Maven项目热部署、nginx反向代理负载均衡

    综上所述,通过Maven项目的热部署以及Nginx的反向代理和负载均衡配置,我们可以有效地提高Web应用程序的开发效率和服务稳定性。在实际的应用场景中,这种技术组合被广泛应用于高并发、高可用性的系统架构设计中。

    Nginx教程从入门到精通到失业

    - **高并发应用构建**:利用 Nginx + Lua + Redis 构建高并发应用程序。 以上内容涵盖了从 Nginx 的基础知识到高级应用的各个方面,适合从初学者到高级用户的各个层次的学习需求。通过这些知识点的学习,不仅可以...

    liunx下nginx和mysql安装文档

    具体的配置过程可能因实际需求而异,建议参考`nginx安装文档.docx`中的详细步骤。 对于MySQL的深入使用,如创建数据库、用户管理和性能优化,可以查阅`mysql安装文档.docx`,该文档应该包含更详尽的指导和最佳实践...

    curl-7.39.0.tar.gz Nginx中curl扩展库

    它提供了一个API,使得开发者可以在自己的应用程序中轻松地进行网络请求。 2. **curl命令行工具**:除了libcurl库,还有一个同名的curl命令行工具,可以直接在终端执行HTTP和其他协议的请求,用于测试、调试和数据...

    NginX on RHEL 安装指南

    NginX on RHEL 安装指南 ...遵循这些步骤,您将能够成功地在RHEL系统上安装并运行NginX,为您的网站或应用程序提供高效、可靠的Web服务。请注意,每个环境都有其独特的需求,因此可能需要根据实际情况调整上述步骤。

    决战Nginx系统卷:高性能Web服务器详解与运维 - 第1章

    ### 决战Nginx系统卷:高性能Web服务器详解与运维 - 第1章 #### Nginx概述与核心功能 Nginx是一款广泛应用于互联网领域的高性能Web服务器与反向代理服务器,以其轻量级的设计、高并发处理能力及低资源消耗而著称。...

    mysql5.5+php+nginx脚本自动化部署

    5. **PHP-FPM集成**:将PHP与Nginx整合,通过FastCGI进程管理器(PHP-FPM)实现PHP处理。配置Nginx以转发PHP请求到PHP-FPM服务。 6. **测试与验证**:启动所有服务,确保MySQL、PHP和Nginx能正常工作。可以通过访问...

    智能家电远程控制系统的设计与实现

    - **指令执行**:通过云端向家电发送控制指令,实现远程控制。 #### 二、智能家电远程控制系统的系统设计关键技术 ##### (一)嵌入式网关定义 - **嵌入式网关**是一种专为物联网设计的小型化、高性能、低功耗的...

    在centos下安装nginx+mysql+php所需要的文件和扩展

    PHP则广泛用于创建动态网页和Web应用程序,与Nginx结合可以实现后端逻辑与前端展示的无缝对接。 "lnmp-install-package"通常是一个脚本或者工具,它封装了安装这三个组件的过程,使得用户无需手动执行一系列复杂的...

    PHP 测试环境-最好用的本地PHP测试环境

    在提供的文件名中,"phpStudy2011A.exe"很可能是这个本地PHP测试环境的安装程序。phpStudy是一款知名的PHP开发工具,它集成了PHP、Apache、MySQL等组件,方便用户快速搭建本地服务器环境。"说明.htm"和"使用说明.txt...

    毕业设计 计算机专业-PHP基于Linux的远程管理系统服务器端的实现(源代码+论文)A.rar

    标题中的“PHP基于Linux的远程管理系统服务器端的实现”是一个典型的IT项目,主要涉及三个关键领域:PHP编程、Linux操作系统以及远程系统管理。这个毕业设计旨在利用PHP语言在Linux环境下构建一个能远程管理系统的...

    nagios+nginx+php配置监控平台

    5. 安装FCGI相关组件,例如`FCGI-0.73.tar.gz`,`FCGI-ProcManager-0.19.tar.gz`,它们是FastCGI的实现,使得CGI应用程序可以以更高效的方式运行。 6. 安装Perl库,如`IO-All-0.41.tar.gz`和`IO-1.25.tar.gz`,可能...

    Android 远程视频监控程序源码.rar

    这个名为"Android 远程视频监控程序源码.rar"的压缩包文件很可能包含了实现这样一个系统的全部源代码。下面将根据这些信息,详细解释可能涉及的知识点。 1. **Android SDK**:这是开发Android应用程序的基础,提供...

    PHP 5.4 & Nginx 1.4.2 [整合Zend Debuger for PHP 5.4]

    这对于解决复杂的程序问题、优化代码和理解程序执行流程至关重要。它与Xdebug类似,但更倾向于企业级应用,因为其支持更多高级功能,如远程调试和代码覆盖分析。 要在PHP 5.4和Nginx 1.4.2环境中集成Zend Debugger...

    linux下jdk+sql+tomcat+nginx集群的安装

    本文档将详细介绍在 Linux 操作系统中如何安装配置 Java Development Kit (JDK)、MySQL 数据库服务器、Apache Tomcat 服务器以及 Nginx 负载均衡器,并进一步讲解如何构建一个简易的集群环境来支持高可用性和负载...

Global site tag (gtag.js) - Google Analytics