正如问题的标题所说,我想使用 Java 获取远程系统的系统信息(如操作系统名称、版本等)。但是在任何人回答这个问题之前,我只想问这是否可能,如果可以,那么如何?
另一个问题是,这应该适用于基于 Unix 和基于 Windows 的系统。我尝试在互联网上搜索,但(几乎)画了一个空白。
编辑:Java 应用程序将是一个桌面应用程序,它必须有凭据才能登录到远程系统,但不会使用 HTTP/RMI。
正如问题的标题所说,我想使用 Java 获取远程系统的系统信息(如操作系统名称、版本等)。但是在任何人回答这个问题之前,我只想问这是否可能,如果可以,那么如何?
另一个问题是,这应该适用于基于 Unix 和基于 Windows 的系统。我尝试在互联网上搜索,但(几乎)画了一个空白。
编辑:Java 应用程序将是一个桌面应用程序,它必须有凭据才能登录到远程系统,但不会使用 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);
}
}
在这种情况下,您需要澄清“远程系统”的含义-例如您如何与之通信>我们在谈论某种形式的HTTP吗?RMI?小程序在浏览器中运行?
然而,一般来说,答案是“不,这是不可能的”。
您要么需要来自远程系统的帮助(即运行在那里的应用程序来发布数据——Web 浏览器会这样做,但仅限于它们访问的服务器),要么需要访问允许一种称为OS 指纹识别技术的低级网络 API 。然而,Java 的网络 API 还不够底层。
您要么需要远程系统的帮助(即,在那里运行的应用程序宣布数据——Web 浏览器会这样做,但仅限于它们访问的服务器),要么需要访问允许一种称为操作系统指纹识别技术的低级网络 API。然而,Java 的网络 API 还不够底层。
尝试使用低级网络 API,例如 SNMP 和 UPnP。SNMP 需要在远程系统中激活/安装代理,您将在 MIB 上获得此信息。UPnP 可以做到这一点,(我不知道具体是怎么做到的,但我确信这是可以做到的)。