由于问题的标题说,我想要得到的系统信息(如操作系统名称,版本等),使用Java远程系统。 但是,任何人回答这个问题之前,我只想问这是否是可能的,如果是的话,怎么样?
还有一个缺点是,这应该两个基于Unix和基于Windows的系统上运行。 我试着在网上搜索,但一无所获(几乎)。
编辑:Java应用程序将是一个桌面应用程序,它必须凭据才能登录到远程系统,但不会有HTTP / RMI那会被使用。
由于问题的标题说,我想要得到的系统信息(如操作系统名称,版本等),使用Java远程系统。 但是,任何人回答这个问题之前,我只想问这是否是可能的,如果是的话,怎么样?
还有一个缺点是,这应该两个基于Unix和基于Windows的系统上运行。 我试着在网上搜索,但一无所获(几乎)。
编辑:Java应用程序将是一个桌面应用程序,它必须凭据才能登录到远程系统,但不会有HTTP / RMI那会被使用。
你需要澄清你所说的“远程系统”在这种情况下的意思 - 在你怎么用它>沟通我们在讨论某种形式的HTTP的? RMI? 小程序浏览器中运行?
但是,总的来说,答案是“不,这是不可能的”。
对于Windows您应该能够访问WMI在远程机器上(有一些丑陋的JNI胶),对于UNIX系统,我不知道的方式(除非你以某种方式有shell访问,那么你可以尝试可能通过SSH登录和做一个uname -a
或类似)。 这将是大量的工作在任何情况下和Java是很难的,正确的工具。
还有上面提到的,你可以尝试一下。 通过获取连接,您可以使用下面的代码中的方法:(如果你愿意的话)
import java.util.Properties;
public class GetCompleteSystemInfo {
public static void main(String args[]) {
//1.Get Java Runtime
Runtime runtime = Runtime.getRuntime();
System.out.println("Runtime=" + Runtime.getRuntime());
//2. Get Number of Processor availaible to JVM
int numberOfProcessors = runtime.availableProcessors();
System.out.println(numberOfProcessors + " Processors ");
//2. Get FreeMemory, Max Memory and Total Memory
long freeMemory = runtime.freeMemory();
System.out.println("Bytes=" + freeMemory + " |KB=" + freeMemory / 1024 + " |MB=" + (freeMemory / 1024) / 1024+" Free Memory in JVM");
long maxMemory = runtime.maxMemory();
System.out.println(maxMemory + "-Bytes " + maxMemory / 1024 + "-KB " + (maxMemory / 1024) / 1024 + "-MB " + " Max Memory Availaible in JVM");
long totalMemory = runtime.totalMemory();
System.out.println(totalMemory + "-Bytes " + totalMemory / 1024 + "-KB " + (totalMemory / 1024) / 1024 + "-MB " + " Total Memory Availaible in JVM");
//3. Suggest JVM to Run Garbage Collector
runtime.gc();
//4. Suggest JVM to Run Discarded Object Finalization
runtime.runFinalization();
//5. Terminate JVM
//System.out.println("About to halt the current jvm");//not to be run always
//runtime.halt(1);
// System.out.println("JVM Terminated");
//6. Get OS Name
String strOSName = System.getProperty("os.name");
if (strOSName != null) {
if (strOSName.toLowerCase().indexOf("windows") != -1) {
System.out.println("This is "+strOSName);
} else {
System.out.print("Can't Determine");
}
}
//7. Get JVM Spec
String strJavaVersion = System.getProperty("java.specification.version");
System.out.println("JVM Spec : " + strJavaVersion);
//8. Get Class Path
String strClassPath = System.getProperty("java.class.path");
System.out.println("Classpath: " + strClassPath);
//9. Get File Separator
String strFileSeparator = System.getProperty("file.separator");
System.out.println("File separator: " + strFileSeparator);
//10. Get System Properties
Properties prop = System.getProperties();
System.out.println("System Properties(detail): " + prop);
//11. Get System Time
long lnSystemTime = System.currentTimeMillis();
System.out.println("Milliseconds since midnight, January 1, 1970 UTC : " + lnSystemTime + "\nSecond=" + lnSystemTime / 1000 + "\nMinutes=" + (lnSystemTime / 1000) / 60 + ""
+ "\nHours=" + ((lnSystemTime / 1000) / 60) / 60 + "\nDays=" + (((lnSystemTime / 1000) / 60) / 60) / 24 + "\nYears=" + ((((lnSystemTime / 1000) / 60) / 60) / 24) / 365);
}
}
这是监控由几十几百机器的一个大型网站的通病。 有喜欢的开源解决方案的Zenoss和Nagios的 。 SNMP是这个领域广泛支持的标准太(和有办法将它们连接成一个基于Java的“仪表板”)。
You either need help from the remote system (i.e. an application running there that announces the data - which web browsers do, but only to the servers they visit) or access to low-level network APIs that allow a technique called OS fingerprinting. However, Java's network APIs are not low-level enough for that.
您可能需要从远程系统帮助(即运行有没有公布的数据的应用程序 - 它的网络浏览器做的,但只有他们访问服务器)或访问低级网络API,允许一个名为操作系统指纹识别技术。 然而,Java的网络API不是低层次的能有这样的。
尝试使用低级别的网络API,例如SNMP和UPnP。 SNMP需要/激活代理安装在远程系统,你将会对MIB信息。 和UPnP可以做到这一点,(我不知道究竟怎么了,但我敢肯定这是可以做到的)。