这篇文档是以前写的。这几天要使用ssh远程操作机器,突然想到了,就把它找出来。测了一把,还行。
1. 介绍
现阶段的服务一般都会运行在一个集群上面,这样,就遇到一个无法回避的问题:服务器(A)如何在服务器(B)上面执行命令或程序。
对于这个问题,常见的两种方法是:
1) 节点A与节点B建立SSH互信关系。当节点A需要在节点B上面执行命令的时候,直接用ssh登录到节点B上面(这也是使用最多的一种方式)。
优点:执行简单。
缺点:在安装配置的时候,复杂。不能够动态增加一个节点
2) 当需要登录到节点B的时候,执行export命令,利用程序的方式临时登录到节点B上面去执行命令。
优点:安装时,无需额外进行配置。
缺点:执行命令的时候,比较复杂。而且还需要考虑环境变量的配置。
Cloudstack的源码中为我们提供第三种方法,为我们解决了上面说到的问题。Cloudstack中的Agent节点是动态加入到Management中去的,在加入之前,可能无法确认哪台机器会加入集群中。因此它通过一个第三方库:trilead-ssh2-build213-svnkit-1.3-patch.jar来实现
2. 代码说明
需要说明的是,这里所使用的代码是从Cloudstack源码中抽取出来的并进行相应的简化
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection("192.168.0.220", 22);
sshConnection.connect(null, 60000, 60000);
if (!sshConnection.authenticateWithPassword("root", "root")) {
System.err.println("Fail to authenticate");
return ;
}
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, "cd /opt; ls -l ", 3)) {
System.err.println("fail to tests");
return ;
}
System.out.println("Success to execute test..");
}
从代码中,可以看出,它一共分为三步:
1)创建ssh2连接对象
com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection("192.168.0.220", 22);
参数说明:第一个参数为远端服务器的IP。 第二个参数为远端服务器的ssh端口。
一般来说默认的ssh登录端口就是22
2)初始化ssh2连接对象
sshConnection.connect(null, 60000, 60000);
此时开始进行连接。后两个参数为超时时间。可以不用管它
if (!sshConnection.authenticateWithPassword("root", "root"))
当连接后,就开始需要输入用户名与密码了。
3)连接创建成功后,就可以执行远端的命令了。
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, "cd /opt; ls -l ", 3)) {
System.err.println("fail to tests");
return ;
}
System.out.println("Success to execute test..");
SSHCmdHelper.java为cloudstack封装的一个命令执行程序。详情可以看它的源码。解释一下它的三个参数:
sshConnection: 我们之前创建的ssh连接
“cd /opt; ls -l “: 需要执行的命令
3: 这个数字3,当上面的命令执行失败后,会重试3次,如果3次都失败了,才会返回失败
从代码中,我们可以看出来,它的返回值为boolean,也就是如果出错,它无法将出错信息带回。这也是它的一个缺点。另一点需要注意,因此在linux中返回值0表示成功,因此我们执行的命令也需要保证这一点
3. 总结
从代码中的,我们可以看到一个SSH的登录过程,因此远端服务器需要能够通过ssh方式登录,否则这种方式就无法登录。最后附上源码。
http://download.csdn.net/detail/eyoulc123/9475606
注:SSHCmdHelper.java第146行的system.out是我加的。大家可以把它干掉。呵