Мой uname -r (и, как и моя настоящая проблема, системное свойство Java os.version) возвращает номер версии, в котором есть тире. Выглядит так: 5.9.12-gentoo-blah-blah.

Это ломает приложение, которое я использую, которому не нравятся тире в номере версии (оно ожидает только число, тире не допускаются).

Как я могу изменить номер версии моей операционной системы? Я просто хочу вернуть версию ядра и не беспокоиться об остальном.

-1
dave 6 Янв 2022 в 15:48
Ну, вы не можете сделать это легко. Один из вариантов — перекомпилировать ядро ​​или подделать вывод uname. Вы ищете решение не в том направлении.
 – 
Alex
6 Янв 2022 в 16:01
4
Это нарушает работу используемого мной приложения, которому не нравятся тире в номере версии (оно ожидает только число, дефисы не допускаются). Это приложение является проблемой, поэтому я бы пошел дальше. и исправить приложение. Вы также запускаете его, похоже, поэтому вы можете предварительно загружать и изменять системные библиотеки. Либо вы исправляете os.version, либо исправляете это приложение. У меня был бы явный фаворит.
 – 
Marcus Müller
6 Янв 2022 в 16:25
1
Но люди правы, когда говорят, что упаковка сломана. Пакет Java анализирует строку версии таким образом, что она ломается почти везде. Кроме того, это пакет Java — зачем он вообще проверяет версию ядра? Разработчики должны это исправить. Однако, как говорят люди, вы можете просто использовать LD_PRELOAD для перехвата его вызова uname(2), как только вы выясните, как java разрешает это через glibc, а затем вы можете обмануть просто java о версии ядра.
 – 
binki
7 Янв 2022 в 06:37
1
Я взломал подход LD_PRELOAD для развлечения: github.com/binki /binki-fool-java-os-версия
 – 
binki
7 Янв 2022 в 07:45
2
Вы можете переопределить системные вызовы в статически связанном исполняемом файле с помощью ptrace. Это немного сложнее, чем LD_PRELOAD. См., например. stackoverflow .com/questions/13426561/…, nullprogram.com/blog/2018/ 23 июня
 – 
Gilles 'SO- stop being evil'
7 Янв 2022 в 11:38

3 ответа

Версия ОС возвращается из ядра с помощью системного вызова uname (man 2 uname для ограниченной информации о ней). Информацию также можно найти в разделе /proc/sys/kernel/osrelease. Этот файл доступен только для чтения, и нет возможности изменить версию операционной системы ядра после его сборки.

Версия ОС устанавливается в Makefile ядра. Первые 4 строки:

VERSION =
PATCHLEVEL =
SUBLEVEL =
EXTRAVERSION =

Также возможно, что дополнительная информация будет добавлена ​​во время сборки, если вы строите из репозитория контроля версий.

Ядро от Gentoo добавляет ЭКСТРАВЕРСИЮ, в которой есть тире. Перед сборкой ядра измените Makefile, чтобы установить нужную версию.

0
dave 7 Янв 2022 в 05:38
1
Для записи см. setarch --uname-2.6 uname -rs (не изменяет содержимое /proc/sys/kernel/osrelease и не удаляет эти -).
 – 
Stéphane Chazelas
7 Янв 2022 в 18:30

Надеюсь, это поможет:

Создайте файл bash, например, my_uname.sh:

#!/usr/bin/env bash

REPLACE_ON="~"
flag=$1
os_uname=$(/usr/bin/uname $flag)
pat="(a|r)"
if [[ "$flag" =~ $pat ]]; then
    echo $os_uname | sed "s/-/$REPLACE_ON/g"
else
    /usr/bin/uname $flag
fi

Следите за своей переменной PATH для нового места сценария

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/13/bin

Установите флаг выполнения и скопируйте сценарий оболочки в ПУТЬ поиска.

chmod +x my_uname.sh
cp my_uname.sh /usr/local/bin/

После этого создайте псевдоним:

alias uname=my_uname.sh

Также вы можете поместить псевдоним в .bashrc или .bash_profile.

-3
spybull 7 Янв 2022 в 05:03
За исключением того, что большинство программ не вызывают uname, а используют интерфейс системного вызова для отображения отображаемой там информации. И даже если бы они это сделали, псевдоним переопределяет только uname при вызове из оболочки, где псевдонимы заменяются, а не из программы, которая вызывает uname
 – 
dave
7 Янв 2022 в 05:42

Если вам просто нужен вывод uname -r без тире и передать его в качестве ввода другому процессу, я бы использовал sed:

uname -r | sed 's/-//g'

РЕДАКТИРОВАТЬ: если вы считаете, что этот ответ бесполезен, объясните, почему, чтобы я мог узнать из вашего ответа. Мы все здесь, чтобы учиться, а не просто ругаться (извините за каламбур).

-5
Ome Cor 6 Янв 2022 в 18:15
Как упоминалось в моем вопросе, проблема заключается в версии ОС, возвращаемой ОС (в частности, для Java, но в более общем плане для uname).
 – 
dave
6 Янв 2022 в 18:16
Спасибо. Итак, почему бы не использовать «sed», чтобы просто вернуть номер версии с помощью регулярного выражения? Избавьтесь от всех символов, кроме цифр и точек. Если вы не можете использовать внешнюю команду между выводом «uname -r» и приложением, в этом случае я неправильно понял ваш первоначальный вопрос.
 – 
Ome Cor
6 Янв 2022 в 18:32
Я не запускаю uname -r, я запускаю приложение, которое получает информацию о версии ОС, ту же информацию, которую возвращает uname -r. Мне нужно, чтобы это было по-другому внутри приложения. Итак, я хочу изменить среду my, чтобы она возвращала другую строку версии.
 – 
dave
6 Янв 2022 в 18:42
Попался! Извините, учусь каждый день...
 – 
Ome Cor
6 Янв 2022 в 21:45