【问题标题】:Get System Information of a Remote Machine (Using Java)获取远程机器的系统信息(使用 Java)
【发布时间】:2017-10-16 11:04:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: java system-information


    【解决方案1】:

    如上所述,您可以尝试一下。顺便说一句,连接后您可以使用以下代码:(如果您愿意)

     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】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • JACOB 在这方面比 JNI 更容易。
            【解决方案6】:

            您要么需要来自远程系统的帮助(即,在那里运行的应用程序宣布数据 - 网络浏览器会这样做,但仅限于它们访问的服务器),要么需要访问允许称为 @987654321 的技术的低级网络 API @。但是,Java 的网络 API 还不够底层。

            【讨论】:

            • 是的。我在想那个。我们肯定需要远程系统的帮助,以便它可以将信息传递给我们的应用程序。
            【解决方案7】:

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

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

            【讨论】:

            • 它只是使用 Java - 一个桌面应用程序。没有到那台机器的 RMI/HTTP 连接。但是该程序必须获得凭据才能访问该远程计算机。
            猜你喜欢
            • 1970-01-01
            • 2014-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-20
            • 1970-01-01
            • 2013-01-04
            相关资源
            最近更新 更多