Как получить кодовое имя Debian без lsb-релиза


14

Я пытаюсь создать скрипт, который требует, чтобы я напечатал кодовое имя debian, чтобы я мог отобразить его в файле sources.list.

Я пытаюсь заставить этот сценарий работать в любой версии Debian, поэтому я надеялся установить переменную bash с кодовым названием выпуска. Это было бы просто сделать (с помощью lsb_release -c), однако наши образы развертывания по умолчанию не содержат lsb_release - и поскольку этот скрипт необходим для исправления sources.list, установка lsb-release с помощью apt-get не подойдет ,

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

Благодарим за любую идею!

(ОС, с которой я тестирую это Debian Squeeze)


1
Если вы гуглили это при рассмотрении вопроса об отбрасывании lsb_release, проверьте его исходный код и посмотрите, готовы ли вы все это заново изобретать
например,

Ответы:


20

Вы можете использовать /etc/os-release:

(
  . /etc/os-release
  printf '%s\n' "$VERSION"
)
7 (wheezy)

10

squeeze не поставляется с /etc/os-release, это мой «хак»:

dpkg --status tzdata|grep Provides|cut -f2 -d'-'

Ооо, брат. Это фигово! Именно то, что мне было нужно. Что-нибудь еще в Linux Mint LMDE (Debian Edition) не отображает версию Debian, на которой был создан Mint. Но ваше решение делает. Благодарность!
GTodorov

5

Вы можете напечатать код вместе с номером версии Debian:

root@debian:/home/mohsen# grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g
8 (jessie)

ИЛИ вы можете получить свое кодовое имя из числа и слова:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie

Или, более awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
идиотски

1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Костас

@ Costas мой вывод только кодовое имя.
Персидский залив

3
Если вы хотите просто кодовое имя, это очень простоawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Костас

4

Вы можете получить код вашего дистрибутива Debian из /etc/os-release. Вместо того, чтобы пытаться проанализировать этот файл, вы можете найти его в новой среде, чтобы не влиять на текущую среду, и выполнить echoкоманду в этой новой среде.

env -i bash -c '. /etc/os-release; echo $VERSION_CODENAME'

Чтобы сломать это:

  • env : Запустить команду в новой среде.
  • -i : Не наследуйте переменные среды от существующей среды.
  • bash Запустите bash, чтобы у нас была оболочка для исходных файлов os-release и для запуска команды echo.
  • -c: Скажите, что bashмы хотим выполнить команду, а не запускать интерактивную оболочку.
  • . /etc/os-release: Источник контента os-releaseв нашу новую среду. os-releaseсодержит несколько строк, устанавливающих переменные среды, и это установит эти переменные среды в нашей новой среде.
  • ; : Разделите эту команду и выполните следующую команду.
  • echo $VERSION_CODENAME: Вывести кодовое имя, заданное os-releaseфайлом.

1
Отличный ответ, я научил вас использовать такие файлы из него. Я использовал это так, echo "$(. /etc/os-release && echo $VERSION_CODENAME"но заметил, что нет $VERSION_CODENAMEв stretch. Очень грустные новости.
Химура

2
Я исправил это так, echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"что кажется правильным для моей задачи, но выглядит плохо
Химура

1
Это выглядит как наиболее элегантный подход (по крайней мере , благодаря не разбору участия)
aexl

2

Для systemd:

hostnamectl | grep "Operating System"

выход:

  Operating System: Debian GNU/Linux 8 (jessie)

Меня устраивает.
AnthonyB

Это, безусловно, не работает в Debian Squeeze, поскольку в Debian Squeeze не было пакета systemd. И даже с Debian 8 Jessie (где systemd стала системой инициализации по умолчанию), hostnamectl устанавливается, только если установлена ​​systemd, поэтому это решение не будет работать, если рассматриваемая система использует одну из других 3 или 4 систем инициализации, предлагаемых Debian.
Аксель

0

Еще одна эвристика - посмотреть, откуда берутся пакеты для работающей в данный момент ОС.

Простой (и, вероятно, подверженный ошибкам) ​​вариант:

fgrep -r /debian/ /etc/apt/sources.list \
    | egrep -v '^ *#' \
    | awk '{print $3}' \
    | egrep -v '[-/]'  \
    | uniq

Более надежный способ - проанализировать детали из вывода apt-cache policy(без дополнительных параметров):

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | awk -F '[,=]' '{print $6}'

apt-cache policyперечисляет все репозитории APT, используемые в локальной системе. Мы отфильтровываем те, которые происходят из Debian, которые помечены просто Debian(то есть не помечены, например Debian debug, например ), затем просматриваем только главный архив (не contribили non-free) и затем выбираем соответствующее значение.

Еще более стабильный подход заключается в том, чтобы не полагаться на порядок элементов и найти n=значение в оставшейся строке:

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | egrep -o 'n=[^, ]*' \
    | awk -F= '{print $2}'

Еще одной возможностью было бы проанализировать /var/lib/apt/lists/*Releaseфайлы самостоятельно вместо того, чтобы позволить apt-cacheэто сделать:

egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
    | xargs egrep -l '^Label: Debian$' \
    | xargs egrep -L 'Codename: .*-' \
    | xargs fgrep Codename \
    | awk '{print $2}'

0

Мне нужно было добавить URL-адрес в sources.list. И чтобы иметь возможность динамически вводить кодовое имя версии, я использую этот фрагмент кода (полагаюсь на тот факт, что кодовое имя находится в скобках): вдохновлено ответом @PersianGulf .

grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g


0

В продолжение ответа @Costas эта команда не работала для 16.04, где она возвращала полное имя «Xerial Xerus», но я хотел только «xerial», поскольку именно так репозиторий, который я пытался вытащить, разделял разные версии. Эта команда добавляет, что будет возвращено только первое слово и что оно будет все в нижнем регистре:

awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($0) }'

Это работает и для "Джесси"


0

Только используя grep:

grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release

Попробуйте (вывод на момент написания этого поста):

$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch

0

этот может (или не может) быть альтернативным подходом к тому, что bcoca написал в Debian squeeze - я протестировал его Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.