正如问题的标题所示,我希望使用Java获取远程系统的系统信息(如操作系统名称,版本等)。但在任何人回答这个问题之前,我只想问这是否可行,如果是,那么如何?
另一个问题是,这应该适用于基于Unix和基于Windows的系统。我试着在网上搜索,但画了一个空白(差不多)。
编辑:Java应用程序将是一个桌面应用程序,它必须有凭据才能登录到远程系统,但是不会使用任何HTTP / RMI。答案 0 :(得分:5)
对于Windows,您应该能够访问远程计算机上的WMI(使用一些丑陋的JNI粘合剂),对于UNIX系统我不知道某种方式(除非您以某种方式具有shell访问权限,否则您可以尝试登录通过SSH并执行uname -a
或类似的操作。在任何一种情况下都会有很多工作,而Java几乎不是正确的工具。
答案 1 :(得分:4)
如上所述,你可以尝试一下。顺便说一下,你可以使用以下代码:(如果你愿意)
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);
}
}
答案 2 :(得分:2)
在这种情况下,您需要澄清“远程系统”的含义 - 例如,如何与之通信>我们在谈论某种形式的HTTP吗? RMI? Applet在浏览器中运行?
然而,一般来说,答案是“不,这是不可能的”。
答案 3 :(得分:1)
答案 4 :(得分:0)
您需要远程系统的帮助(即在那里运行的应用程序宣布数据 - Web浏览器执行的操作,但仅限于他们访问的服务器)或访问允许使用名为{{ 3}}。但是,Java的网络API并不是那么低级。
答案 5 :(得分:0)
您需要远程系统的帮助(即在那里运行的应用程序宣布数据 - Web浏览器执行的操作,但仅限于他们访问的服务器)或访问允许使用称为OS指纹识别技术的低级网络API 。但是,Java的网络API并不是那么低级。
答案 6 :(得分:0)
尝试使用SNMP和UPnP等低级网络API。 SNMP需要在远程系统中激活/安装代理,您将在MIB上获得此信息。 UPnP可以做到这一点,(我不知道究竟是怎么回事,但我确信可以做到)。