Wie bekomme ich Debian Codename ohne LSB-Release

12

Ich versuche, ein Skript zu erstellen, bei dem ich den Debian-Codenamen drucken muss, damit ich ihn in die Datei sources.list übertragen kann.

Ich versuche, dieses Skript für jede Debian-Version zum Laufen zu bringen, daher hatte ich gehofft, eine Bash-Variable des Release-Codenamens festzulegen. Dies wäre einfach (mit lsb_release -c), unsere Bereitstellungsimages enthalten jedoch standardmäßig nicht lsb_release. Da dieses Skript zum Korrigieren der Datei "sources.list" erforderlich ist, ist die Installation von lsb-release mit apt-get keine Option .

Ich habe zahlreiche Möglichkeiten gefunden, um die Versionsnummer und andere Informationen über das System zu erhalten, kann aber keinen zuverlässigen Ort finden, um den Codenamen zu erhalten.

Irgendwelche Ideen wären sehr dankbar!

(OS, mit dem ich das teste, ist Debian Squeeze)

Woody
quelle
1
Wenn Sie dies gegoogelt haben, während Sie über das Löschen nachgedacht haben lsb_release, überprüfen Sie den Quellcode und prüfen Sie, ob Sie bereit sind, all das neu zu erfinden
aexl

Antworten:

19

Sie können verwenden /etc/os-release:

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

Squeeze wird nicht mit ausgeliefert /etc/os-release, dies ist mein 'Hack':

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
quelle
Yooo, Bruder. Das ist krank! Genau das, was ich brauchte. Alles andere in Linux Mint LMDE (Debian Edition) zeigt nicht die Debian-Version an, auf der die Mint basiert. Aber Ihre Lösung tut es. Vielen Dank!
GTodorov
4

Sie können Code zusammen mit der Versionsnummer von debian drucken:

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

ODER Sie können Ihren Codenamen aus Nummer und Pranthese entblößen:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Persischer Golf
quelle
Oder idiomatischer:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
Jasonwryan
1
@ Jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
@Costas meine Ausgabe ist nur Codename.
PersianGulf
3
Wenn Sie nur Codenamen möchten, ist es viel einfacherawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
3

Den Codenamen Ihrer Debian-Distribution erhalten Sie von /etc/os-release. Anstatt zu versuchen, diese Datei zu analysieren, können Sie sie in eine neue Umgebung übertragen, um keine Auswirkungen auf Ihre aktuelle Umgebung zu haben, und einen echoBefehl in dieser neuen Umgebung ausführen .

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

Um es aufzuschlüsseln:

  • env : Führen Sie einen Befehl in einer neuen Umgebung aus.
  • -i : Erben Sie die Umgebungsvariablen nicht von der vorhandenen Umgebung.
  • bash : Führen Sie bash aus, damit wir eine Shell haben, in die wir die os-release-Datei einbinden und den Befehl echo ausführen können.
  • -c: Sagen Sie, bashwir möchten einen Befehl ausführen, anstatt eine interaktive Shell zu starten.
  • . /etc/os-release: Geben Sie den Inhalt von os-releasein unsere neue Umgebung ein. os-releaseenthält einige Zeilen zum Festlegen von Umgebungsvariablen. Dadurch werden diese Umgebungsvariablen in unserer neuen Umgebung festgelegt.
  • ; : Trennen Sie diesen Befehl und führen Sie den nächsten Befehl aus.
  • echo $VERSION_CODENAME: Geben Sie den von der os-releaseDatei festgelegten Codenamen wieder .
Leigh McCulloch
quelle
Tolle Antwort, ich habe gelernt, solche Dateien daraus zu verwenden. Ich habe es so benutzt, echo "$(. /etc/os-release && echo $VERSION_CODENAME"aber bemerkt, dass es kein $VERSION_CODENAMEIn gibt stretch. Sehr traurige Nachricht.
Himura
1
Ich habe es so behoben, echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"was für meine Aufgabe in
Ordnung zu sein
Dies
scheint
2

Für systemd:

hostnamectl | grep "Operating System"

Ausgabe:

  Operating System: Debian GNU/Linux 8 (jessie)
GAD3R
quelle
Für mich geht das.
AnthonyB
Dies funktioniert bei Debian Squeeze sicherlich nicht, da Debian Squeeze kein systemd-Paket hatte. Und selbst mit Debian 8 Jessie (wo systemd zum Standard-Init-System wurde) wird hostnamectl nur installiert, wenn systemd installiert ist. Daher funktioniert diese Lösung nicht, wenn das betreffende System eines der anderen 3 oder 4 Init-Systeme verwendet, die Debian anbietet.
Axel Beckert
0

Eine weitere Heuristik besteht darin, festzustellen, woher die Pakete für das aktuell ausgeführte Betriebssystem stammen.

Einfache (und wahrscheinlich fehleranfällige) Variante:

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

Eine zuverlässigere Methode besteht darin, die Details aus der Ausgabe von apt-cache policy(ohne weitere Parameter) zu analysieren :

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

apt-cache policylistet alle auf dem lokalen System verwendeten APT-Repositorys auf. Wir filtern diejenigen heraus, die von Debian stammen, die nur als Debiansolche gekennzeichnet sind (dh nicht diejenigen, die als z. B. gekennzeichnet sind Debian debug), schauen uns dann nur das Hauptarchiv an (nicht contriboder non-free) und wählen dann den entsprechenden Wert aus.

Ein noch stabilerer Ansatz wäre, sich nicht auf die Elementreihenfolge zu verlassen und den n=Wert in der verbleibenden Zeile zu finden:

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

Eine weitere Möglichkeit wäre, die /var/lib/apt/lists/*ReleaseDateien selbst zu analysieren, anstatt dies zuzulassen 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}'
Axel Beckert
quelle
0

Ich musste eine URL in die Datei sources.list einfügen. Und um den Versionscode dynamisch einfügen zu können, verwende ich diesen Code (abhängig von der Tatsache, dass der Codename in Klammern steht): Inspiriert von der Antwort von @PersianGulf .

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

JoDev
quelle
0

Als ich die Antwort von @Costas erweiterte , funktionierte dieser Befehl für 16.04 nicht, wo er den vollständigen Namen "Xerial Xerus" zurückgab, aber ich wollte nur "xerial", da das Repo, aus dem ich versuchte, die verschiedenen Versionen zu trennen. Dieser Befehl fügt hinzu, dass nur das erste Wort zurückgegeben wird und dass alles in Kleinbuchstaben geschrieben wird:

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

Dies funktioniert auch für "jessie"

Josh Reid
quelle
0

Nur mit grep:

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

Probieren Sie es aus (Ausgabe zum Zeitpunkt des Schreibens dieses Beitrags):

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

Dies könnte (oder könnte nicht) eine alternative Herangehensweise an das sein, was bcoca über Debian Squeeze geschrieben hat - ich habe es Ubuntu 18.04 getestet:

$ cat /etc/debian_version
buster/sid
Alexander Stohr
quelle