Получить системную информацию об удаленной машине (с помощью Java)

Как следует из названия вопроса, я хочу получить системную информацию (например, имя ОС, версию и т. д.) удаленной системы с использованием Java. Но прежде чем кто-либо ответит на этот вопрос, я просто хочу спросить, возможно ли это, если да, то как?

Еще одна загвоздка заключается в том, что это должно работать как для систем на основе Unix, так и для систем на основе Windows. Я пытался искать в Интернете, но ничего не нашел (почти).

РЕДАКТИРОВАТЬ: приложение Java будет настольным приложением, и ему потребуются учетные данные, чтобы иметь возможность войти в удаленную систему, но не будет использоваться HTTP/RMI.


person Kirtan    schedule 16.07.2009    source источник


Ответы (7)


Вам нужно уточнить, что вы подразумеваете под «удаленной системой» в данном случае — например, как вы с ней общаетесь> Мы говорим о какой-то форме HTTP? РМИ? Апплет работает в браузере?

Однако, как правило, ответ «Нет, это невозможно».

person ChssPly76    schedule 16.07.2009
comment
Это просто использование Java - настольного приложения. С этой машиной нет соединения RMI/HTTP. Но программе потребуются учетные данные для доступа к этому удаленному компьютеру. - person Kirtan; 16.07.2009

Для Windows вы должны иметь доступ к WMI на удаленной машине (с каким-то уродливым клеем JNI), для систем UNIX я не знаю способа (если у вас нет доступа к оболочке, тогда вы, вероятно, можете попробовать войти через SSH и сделать uname -a или подобное). В любом случае потребуется много работы, и Java вряд ли подойдет для этого.

person Joey    schedule 16.07.2009
comment
JACOB для этого проще, чем JNI. - person finnw; 05.02.2010

как упоминалось выше, вы можете попробовать их. Кстати, после подключения вы можете использовать следующие коды: (если хотите)

 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);
      }
   }
person Manjeet    schedule 23.09.2012

Это обычная проблема при мониторинге большого сайта, состоящего из десятков или сотен машин. Существуют решения с открытым исходным кодом, такие как Zenoss и Nagios. SNMP также является широко поддерживаемым стандартом в этой области (и есть способы подключить их к «приборной панели» на основе Java).

person Jim Ferrans    schedule 16.07.2009

Вам нужна либо помощь от удаленной системы (т. е. работающее там приложение, которое объявляет данные — что и делают веб-браузеры, но только серверам, которые они посещают), либо доступ к низкоуровневым сетевым API, которые позволяют использовать технику, называемую Снятие отпечатков ОС. Однако сетевые API Java недостаточно низкоуровневы для этого.

person Michael Borgwardt    schedule 16.07.2009
comment
Да. Я думал об этом. Нам ОБЯЗАТЕЛЬНО понадобится помощь удаленной системы, чтобы она могла передать информацию нашему приложению. - person Kirtan; 16.07.2009

Вам нужна либо помощь от удаленной системы (т. е. работающее там приложение, которое объявляет данные — что и делают веб-браузеры, но только серверам, которые они посещают), либо доступ к низкоуровневым сетевым API, которые позволяют использовать метод, называемый снятием отпечатков пальцев ОС. Однако сетевые API Java недостаточно низкоуровневы для этого.

person asis    schedule 05.02.2010

Попробуйте использовать низкоуровневый сетевой API, такой как SNMP и UPnP. Для SNMP требуется активация/установка агента в удаленной системе, и у вас будет эта информация в MIB. И UPnP может это сделать (я не знаю, как именно, но я уверен, что это можно сделать).

person imanis_tn    schedule 30.03.2012