Получение дистрибутива Linux из Java

Из Java я получил имя операционной системы Iam работает. Смотрите ниже код:

System.out.println(System.getProperty("os.name"));

В Windows XP он печатает как: Windows XP

Но в Ubuntu/ Fedora, он показывает только Linux,

Может кто-нибудь помочь мне найти, какую версию Linux я использую (например, Ubuntu или Fedora), используя Java-код? Можно ли найти дистрибутив Linux из Java?

4 ответа

Решение

Этот код может помочь вам:

String[] cmd = {
"/bin/sh", "-c", "cat /etc/*-release" };

try {
    Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader bri = new BufferedReader(new InputStreamReader(
            p.getInputStream()));

    String line = "";
    while ((line = bri.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {

    e.printStackTrace();
}

ОБНОВИТЬ

Если вам нужна только версия, попробуйте с помощью uname -a

ОБНОВИТЬ

Некоторые дистрибутивы Linux содержат версию дистрибутива в файле /proc/version. Вот пример, чтобы напечатать их все из Java без вызова каких-либо команд SO

//lists all the files ending with -release in the etc folder
File dir = new File("/etc/");
File fileList[] = new File[0];
if(dir.exists()){
    fileList =  dir.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String filename) {
            return filename.endsWith("-release");
        }
    });
}
//looks for the version file (not all linux distros)
File fileVersion = new File("/proc/version");
if(fileVersion.exists()){
    fileList = Arrays.copyOf(fileList,fileList.length+1);
    fileList[fileList.length-1] = fileVersion;
}       
//prints all the version-related files
for (File f : fileList) {
    try {
        BufferedReader myReader = new BufferedReader(new FileReader(f));
        String strLine = null;
        while ((strLine = myReader.readLine()) != null) {
            System.out.println(strLine);
        }
        myReader.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}

Исходя из этого, я расширил код, включив в него различные резервные сценарии, чтобы получить версии ОС на нескольких платформах.

  • Windows достаточно наглядна, вы получаете информацию из системного свойства 'os.name'
  • Mac OS: вам нужно вести список названий выпусков в соответствии с версией
  • Linux: это самое сложное, вот список откатов:
    - получить информацию из файла релиза LSB, если дистрибутив совместим с LSB
    - получить информацию из / etc / system-release, если она существует
    - получить информацию из любого файла, оканчивающегося на '-release' в / etc /
    - получить информацию из любого файла, оканчивающегося на '_version' в /etc/ (в основном для Debian)
    - получить информацию из / etc / issue, если она существует
    - в худшем случае получить информацию из /proc/version

  • Вы можете получить служебный класс здесь:
    https://github.com/aurbroszniowski/os-platform-finder

    Одним из специальных способов получить имя дистрибутива Linux является чтение содержимого /etc/*-release файл. Это даст вам что-то вроде CentOS release 6.3 (Final),

    Читать содержимое этого файла из Java просто.

    Возможно, это не лучший способ, но он справится со своей задачей, также это работает только на *nix box, а не на windows.

    Вы можете использовать Java для запуска uname -rи получить результаты; это обычно показывает дистрибутив, если он не был составлен каким-то чуваком из источника в его подвале. Для моей машины:

    mao@korhal ~ $ uname -r
    3.4.9-gentoo
    

    и запустить его:

    Process p = Runtime.getRuntime().exec("uname -r");  
    BufferedReader in = new BufferedReader(  
                        new InputStreamReader(p.getInputStream()));  
    String distro = in.readLine();  
    
    // Do something with distro and close reader
    

    Изменить: возможно uname -a будет лучше работать здесь для дистрибутивов в целом. Или посмотрите на /etc/*-release файлы, которые, как представляется, обычно определяются на большинстве генералов.

    Другие вопросы по тегам