题记:
最近弄一个视频有关的项目,有很多的视频存储,所以存储这块就有必要进行一些监控,及内容淘汰等策略。存储设备都是分布式部署的,我们不希望在
server上安装特别的插件,如何获取远程磁盘信息,成了我最大的障碍。目前采用的方式是java建立telnet连接,发送操作系统命令,解析返回信
息,在此整理下。
摘要:
这是我第一次接触到java获取远程操作系统信息的工作,刚拿到需求有点两眼一抹黑,百度、Google的不少资料。总结起来大概三种类型:
1:Apache的commons.io中有一个工具类方法:FileSystemUtils.freeSpaceKb(path),可以通过共享目录方式获取磁盘剩余信息。
2:JConfig拓展工具,调用系统底层命令,获取磁盘信息。参考资料:http://huangyunzeng.iteye.com/blog/1142873
3:使用jni技术,这个是解决所有和os相关的操作的万能利器了。这个没深入研究过,不会,在此就不多提了。
在看到Apache的FileSystemUtils的时候,在本机测试了下,有点激动了。不过很快发现,这只能获取本地磁盘信息,要获取远程磁盘信息只
能建立共享目录。这显然不能满足我们的要求,不过正是FileSystemUtils工具包的实现原理给了我启发:调用操作系统命令,然后解析,获取信息
是一种不错的方式。
-
Runtime.getRuntime().exec(String command)
现在的问题就变成:建立远程连接,调用操作系统命令,然后解析返回值。我只要找到一种建立连接的方式就能完成任务了。顺着这个思路,后来选择了Telnet,理由如下:
a:Apache中收录了Telnet. org.apache.commons.net.telnet.TelnetClient,可以直接使用Client,不用再考虑socket Server端的实现等。
b:系统中一般都已自带了telnet,只需启动telnet服务就好,不用安装其他的插件。
c:为不用更安全的SSH协议建立连接呢?因为我程序中需要识别操作系统类型。telnet在建立连接后,有一个头信息,根据这个头信息能基本判断是
Window,还是Linux。而换成SSH后,建立连接就不能这么方便的获取操作系统类型了。在此,我就暂时恶心一下,用Telnet吧。
正文:
一、telnet暨磁盘监控原理简介
二、分享部分实现代码
一、telnet暨磁盘监控原理简介
如果你仔细阅读了摘要的内容,相信已经明了本文telnet远程监控磁盘信息的大概原理了。在此再提一遍,是为了补充一些更细节的内容。
二:部分实现代码:
1:成员变量及构造方法
-
private
TelnetClient telnet =
new
TelnetClient(
"VT220"
);
-
private
InputStream in;
-
-
private
PrintStream out;
-
-
private
char
prompt =
"$"
-
public
TelnetShell(String ip,
int
port, String user, String password)
-
throws
SocketException, IOException {
-
telnet.connect(ip, port);
-
in = telnet.getInputStream();
-
out = new
PrintStream(telnet.getOutputStream());
-
-
this
.prompt = user.equals(
"root"
) ?
'#'
:
'>'
;
-
login(user, password);
-
}
建立连接:
-
-
-
-
-
-
-
-
-
-
public
void
login(String user, String password)
throws
SocketException {
-
String thead = readUntil("login:"
);
-
setOsType(thead);
-
write(user);
-
readUntil("password:"
);
-
write(password);
-
-
-
boolean
loginSuccess = judgeLogin();
-
System.out.println("loginSuccess or not ? "
+ loginSuccess);
-
if
(loginSuccess) {
-
readUntil(prompt + ""
);
-
} else
{
-
throw
new
SocketException(
"Login Failed..."
);
-
}
-
}
读/写操作
-
-
-
-
-
-
-
-
-
-
-
-
public
String readUntil(String pattern) {
-
try
{
-
char
lastChar = pattern.charAt(pattern.length() -
1
);
-
StringBuffer sb = new
StringBuffer();
-
char
ch = (
char
) in.read();
-
-
System.out.print(ch);
-
while
(ch != -
1
) {
-
sb.append(ch);
-
if
(ch == lastChar) {
-
if
(sb.toString().toLowerCase().endsWith(pattern)) {
-
-
if
(!sb.toString().toLowerCase().endsWith(
"<dir>"
)) {
-
System.out.println("提取完毕"
);
-
return
sb.toString();
-
}
-
}
-
}
-
-
ch = (char
) in.read();
-
System.out.print(ch);
-
}
-
} catch
(Exception e) {
-
e.printStackTrace();
-
}
-
return
null
;
-
}
-
-
-
-
-
-
public
void
write(String value) {
-
try
{
-
out.println(value);
-
out.flush();
-
} catch
(Exception e) {
-
e.printStackTrace();
-
}
-
}
识别系统类型,执行命令
-
-
-
-
-
-
public
void
setOsType(String telnetHeadInfo) {
-
if
(
null
== telnetHeadInfo ||
""
.equals(telnetHeadInfo))
-
return
;
-
-
if
(telnetHeadInfo.indexOf(
"Microsoft"
) != -
1
) {
-
os = 1
;
-
} else
if
(telnetHeadInfo.indexOf(
"Kernel"
) != -
1
) {
-
os = 2
;
-
} else
-
os = 3
;
-
}
-
-
-
-
-
-
-
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();
-
}
-
}
这样,建立连接、识别操作系统,执行命令,读取返回等都基本完成了。可以说Telnet远程获取操作系统信息的大部分代码已经完成。当然,在提供外层封装上,你也可以仿照Apache的FileSystemUtils写一个工具类,采用一些工厂类的模式方便调用,拓展。
最后,可能您已经发现了,本文的标题是要监控“磁盘信息”,但我完全可以获取跟多信息。有了这个telnetShell.java后,我完全可以发送其他系统命令,获取更多信息。这就看你怎么发挥了,呵呵。
分享到:
相关推荐
简易的telnet操作java.rar
主要介绍了使用java实现telnet-client工具,需要的朋友可以参考下
java实现Telnet协议的远程服务器连接,运行稳定,性能佳。
Java Telnet客户端实例源码
基于java的telnet服务器实现,Java TelnetD library (embeddable telnet daemon)
通过命令的形式,实现类似java调用cmd命令一样获取到对应的数据并返回值
java 实现telnet服务器执行脚本
java源代码,通过telnet方式连接服务器,可以设置是否记录日志等信息。经过稍微改动可以实现类似crt软件的功能。
Java Telnet客户端实例源码。。。
java telnet 服务器实现 .
用Java实现telnet到另一台UNIX机器
java-telnet连接远程服务器并执行shell命令 具体代码 java-telnet
java的telnet example,还有tftp 协议
Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题。 分数太高了,不是我设置的,也改不了了,大家不要下了。
new TelnetConnectionUtil(SDKNode.nodeVo.getIp(),SDKNode.nodeVo.getPassword(),Integer.valueOf(SDKNode.nodeVo.getPort()));...java模拟telnet链接,获取信息,进行各种解析。什么地方开始,什么地方结束。
本资源使用Java实现Telnet客户端程序,程序有界面,并且资源中简单的写了使用说明,希望能帮到大家
java gui 实现telnet登录交换机
自己编辑的一个java-jar,是用telnet和ssh连接远端服务器的开发应用