2008-07-25
利用apache commons-net 开源包,使用telnet方式获取AIX主机信息
关键字: commons-net-1.4.1 telnet aix主机/***
** QQ:252574345
** MSN:lele_love_lomboz@hotmail.com
***/
一。AIX简介
AIX全名为Advanced Interactive Executive,俗称“An IBM uniX”或“Advanced IBM uniX”。
作为综合评价第一的unix操作系统(D.H. Brown咨询公司,1998年 ),AIX是真正的第二代unix,具有性能卓越、易于使用、扩充性强、适合企业关键应用等众多特点。
支持300种以上的IBM软件和超过13000家独立软件厂商的软件产品。
是非常优秀的操作系统
在银行、电力系统、电信移动等企业应用很广泛
下面,我们介绍下对AIX系统的信息采集
二。
下面是一个利用apache commons-net 开源包, 使用telnet方式连接的工具类
实现对AIX主机信息的采集
因为提示符已经写死了,如果采用本例,请先按照自己的真实环境修改提示符和用户名和密码 等基本信息
package test.collector.telnet;
import java.io.InputStream;
import java.io.PrintStream;
import org.apache.commons.net.telnet.TelnetClient;
/**
* 利用apache net 开源包,使用telnet方式获取AIX主机信息
* @author zhaoyl
* @date 20008.7.21
* @version 1.2
*/
public class NetTelnet {
//Telnet对象
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
//提示符。具体请telnet到AIX主机查看
private char prompt = '#';
//telnet端口
private String port;
//用户
private String user;
//密码
private String password;
//IP地址
private String ip;
public NetTelnet() {
try {
//AIX主机IP
this.ip = "10.1.2.222";
this.password = "loeisdke";
this.user = "whdiwpasdq232sd2323";
this.port = "23";
telnet.connect(ip, Integer.parseInt(port));
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
//登录
readUntil("login: ");
write(user);
readUntil("Password: ");
write(password);
readUntil(prompt + " ");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取分析结果
* @param pattern
* @return
*/
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
char ch = (char) in.read();
while (true) {
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 写
* @param value
*/
public void write(String value) {
try {
out.println(value);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向目标发送命令字符串
* @param command
* @return
*/
public String sendCommand(String command) {
try {
write(command);
return readUntil(prompt + " ");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
*
*/
public void disconnect() {
try {
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
NetTelnet telnet = new NetTelnet();
//通过aix的命令“查找主机名称”获取数据
//命令是 "hostname"
//不熟悉命令的参考<<AIX网络管理手册>>
String result = telnet.sendCommand("hostname");
System.out.println(result);
//最后一定要关闭
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}


评论
2 持有这个链接很不稳定,耗资源,所以用nohup...
我测试的HP的UNIX服务器,我为了看到执行的过程
则System.out.println(readUntil("login:"))、System.out.println(readUntil("Password:"))等信息,所以导致了很大的内存被吃掉了,把这些语句屏蔽掉就没有问题了。
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
请先debug,2个条件是否都满足了
我刚才在aix低版本,5版本下测试都没问题
具体问题在贴出来,一起看看
而是会一直读数据,造成了死循环。
这是为什么啊?