Jak zdobyć kryptonim Debiana bez wydania lsb

15

Próbuję utworzyć skrypt, który wymaga ode mnie wypisania kryptonimu debian, aby móc powtórzyć go w pliku sources.list.

Próbuję sprawić, aby ten skrypt działał w dowolnej wersji Debiana, więc miałem nadzieję ustawić zmienną bash w nazwie kodowej wydania. Byłoby to łatwe do zrobienia (z lsb_release -c), jednak nasze obrazy wdrażania domyślnie nie zawierają lsb_release - a przy tym skrypcie wymaganym do naprawy pliku sources.list, instalacja lsb-release z apt-get nie byłaby opcją .

Znalazłem wiele sposobów na uzyskanie numeru wersji i innych informacji o systemie, ale nie mogę znaleźć wiarygodnego miejsca na uzyskanie nazwy kodowej.

Wszelkie pomysły będą mile widziane!

(System operacyjny, z którym testuję to Debian Squeeze)

Drzewiasty
źródło
1
Jeśli google to Rozważając spada lsb_release, sprawdź jego kod źródłowy i sprawdzić, czy jesteś gotów na nowo wszystko
aexl

Odpowiedzi:

20

Możesz użyć /etc/os-release:

(
  . /etc/os-release
  printf '%s\n' "$VERSION"
)
7 (wheezy)
Cuonglm
źródło
10

squeeze nie jest wysyłany /etc/os-release, oto mój „hack”:

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
źródło
Taa, stary. To jest chore! Dokładnie to, czego potrzebowałem. Cokolwiek innego w Linux Mint LMDE (edycja Debian) nie wyświetla wersji Debiana, na której zbudowano mennicę. Ale twoje rozwiązanie tak. Dzięki!
GTodorov
5

Możesz wydrukować kod wraz z numerem wersji debian:

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

LUB możesz odsłonić swoją nazwę kodową od numeru i pranthese:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Zatoka Perska
źródło
Lub, bardziej idiomatycznie:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan
1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
@ Koszt mojego wyjścia to tylko nazwa kodowa.
PersianGulf
4
Jeśli chcesz tylko kryptonim, jest to bardzo prosteawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
5

Możesz uzyskać kryptonim dystrybucji Debiana /etc/os-release. Zamiast próbować parsować ten plik, możesz pobrać go do świeżego środowiska, aby nie wpływać na bieżące środowisko, i wykonać echopolecenie w tym nowym środowisku.

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

Aby to rozbić:

  • env : Uruchom polecenie w nowym środowisku.
  • -i : Nie dziedzicz zmiennych środowiskowych z istniejącego środowiska.
  • bash : Uruchom bash, aby uzyskać powłokę, w której można pobrać plik wydania systemu operacyjnego i uruchomić polecenie echo.
  • -c: Powiedz, bashże chcemy wykonać polecenie, a nie uruchomić interaktywną powłokę.
  • . /etc/os-release: Źródło treści os-releasew naszym nowym środowisku. os-releasezawiera kilka wierszy ustawiających zmienne środowiskowe, a to ustawi te zmienne środowiskowe w naszym nowym środowisku.
  • ; : Oddziel to polecenie i uruchom następne polecenie.
  • echo $VERSION_CODENAME: Wypisz nazwę kodową ustawioną przez os-releaseplik.
Leigh McCulloch
źródło
1
Świetna odpowiedź, nauczyłem się z niego korzystać z takich plików. Używałem go w ten sposób echo "$(. /etc/os-release && echo $VERSION_CODENAME", ale zauważyłem, że nie znajduje się $VERSION_CODENAMEw stretch. Bardzo smutne wieści.
Himura
2
Naprawiłem to w ten sposób, echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"co wydaje się odpowiednie dla mojego zadania, ale wygląda źle
Himura
1
To wygląda na najbardziej eleganckie podejście (przynajmniej dzięki
brakowi
2

Dla systemd:

hostnamectl | grep "Operating System"

wynik:

  Operating System: Debian GNU/Linux 8 (jessie)
GAD3R
źródło
Mi to pasuje.
AnthonyB
To z pewnością nie działa w przypadku Debian Squeeze, ponieważ Debian Squeeze nie miał pakietu systemowego. I nawet w przypadku Debiana 8 Jessie (gdzie systemd stał się domyślnym systemem init), hostnamectl jest instalowany tylko wtedy, gdy systemd jest zainstalowany, więc to rozwiązanie nie będzie działać, jeśli dany system używa jednego z 3 lub 4 systemów inicjujących, które oferuje Debian.
Axel Beckert,
0

Inną heurystyką jest sprawdzenie, skąd pochodzą pakiety dla aktualnie działającego systemu operacyjnego.

Prosty (i prawdopodobnie podatny na błędy) wariant:

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

Bardziej niezawodnym sposobem jest parsowanie szczegółów z danych wyjściowych apt-cache policy(bez dalszych parametrów):

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

apt-cache policywyświetla listę wszystkich repozytoriów APT używanych w systemie lokalnym. Odfiltrowujemy te, które pochodzą z Debiana, które są oznaczone tylko Debian(tzn. Nie są oznaczone np. Debian debug), Następnie patrzymy tylko na archiwum główne (nie contriblub non-free), a następnie wybieramy odpowiednią wartość.

Jeszcze bardziej stabilnym podejściem byłoby nie poleganie na kolejności elementów i znajdowanie n=wartości w pozostałym wierszu:

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

Jeszcze inną możliwością byłoby samodzielne parsowanie /var/lib/apt/lists/*Releaseplików zamiast pozwalania apt-cachena to:

egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
    | xargs egrep -l '^Label: Debian$' \
    | xargs egrep -L 'Codename: .*-' \
    | xargs fgrep Codename \
    | awk '{print $2}'
Axel Beckert
źródło
0

Potrzebowałem dodać adres URL w pliku sources.list. Aby móc dynamicznie wstawiać nazwę kodową wersji, używam tego fragmentu kodu (polegam na tym, że nazwa kodowa znajduje się między nawiasami): Zainspirowany odpowiedzią @PersianGulf .

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

JoDev
źródło
0

Rozwijając odpowiedź @Costas , to polecenie nie działało dla 16.04, gdzie zwróciło pełną nazwę „Xerial Xerus”, ale chciałem tylko „Xerial”, ponieważ w ten sposób repo, z którego próbowałem pobrać, rozdzieliło różne wersje. To polecenie dodaje, że zwracane będzie tylko pierwsze słowo i wszystkie małe litery:

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

Działa to również w przypadku „jessie”

Josh Reid
źródło
0

Używając tylko grep:

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

Wypróbuj (dane wyjściowe w momencie pisania tego postu):

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

ten może (lub nie musi) być alternatywnym podejściem do tego, co napisał bcoca na temat ściśnięcia Debiana - przetestowałem to Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Alexander Stohr
źródło