Получение дистрибутива 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());
}
}
Исходя из этого, я расширил код, включив в него различные резервные сценарии, чтобы получить версии ОС на нескольких платформах.
- получить информацию из файла релиза 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
файлы, которые, как представляется, обычно определяются на большинстве генералов.