2

正如问题的标题所说,我想使用 Java 获取远程系统的系统信息(如操作系统名称、版本等)。但是在任何人回答这个问题之前,我只想问这是否可能,如果可以,那么如何?

另一个问题是,这应该适用于基于 Unix 和基于 Windows 的系统。我尝试在互联网上搜索,但(几乎)画了一个空白。

编辑:Java 应用程序将是一个桌面应用程序,它必须有凭据才能登录到远程系统,但不会使用 HTTP/RMI。

4

7 回答 7

5

对于 Windows,您应该能够访问远程机器上的 WMI(使用一些丑陋的 JNI 胶水),对于 UNIX 系统,我不知道有什么方法(除非您以某种方式具有 shell 访问权限,那么您可能可以尝试通过 SSH 和做一个uname -a或类似的)。在这两种情况下都需要做很多工作,而 Java 几乎不是合适的工具。

于 2009-07-16T05:31:23.943 回答
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);
      }
   }
于 2012-09-23T19:58:24.277 回答
2

在这种情况下,您需要澄清“远程系统”的含义-例如您如何与之通信>我们在谈论某种形式的HTTP吗?RMI?小程序在浏览器中运行?

然而,一般来说,答案是“不,这是不可能的”。

于 2009-07-16T05:21:16.990 回答
1

这是监控由数十台或数百台机器组成的大型站点的常见问题。有像ZenossNagios这样的开源解决方案。SNMP 也是该领域广泛支持的标准(并且有多种方法可以将它们连接到基于 Java 的“仪表板”中)。

于 2009-07-16T05:28:48.957 回答
0

您要么需要远程系统的帮助(即,在那里运行的应用程序宣布数据——Web 浏览器会这样做,但仅限于它们访问的服务器),要么需要访问允许一种称为操作系统指纹识别技术的低级网络 API。然而,Java 的网络 API 还不够底层。

于 2010-02-05T11:50:07.820 回答
0

尝试使用低级网络 API,例如 SNMP 和 UPnP。SNMP 需要在远程系统中激活/安装代理,您将在 MIB 上获得此信息。UPnP 可以做到这一点,(我不知道具体是怎么做到的,但我确信这是可以做到的)。

于 2012-03-30T11:06:43.643 回答