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)
lsb_release
, überprüfen Sie den Quellcode und prüfen Sie, ob Sie bereit sind, all das neu zu erfindenAntworten:
Sie können verwenden
/etc/os-release
:quelle
Squeeze wird nicht mit ausgeliefert
/etc/os-release
, dies ist mein 'Hack':quelle
Sie können Code zusammen mit der Versionsnummer von debian drucken:
ODER Sie können Ihren Codenamen aus Nummer und Pranthese entblößen:
quelle
awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
awk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
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 einenecho
Befehl in dieser neuen Umgebung ausführen .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,bash
wir möchten einen Befehl ausführen, anstatt eine interaktive Shell zu starten.. /etc/os-release
: Geben Sie den Inhalt vonos-release
in unsere neue Umgebung ein.os-release
enthä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 deros-release
Datei festgelegten Codenamen wieder .quelle
echo "$(. /etc/os-release && echo $VERSION_CODENAME"
aber bemerkt, dass es kein$VERSION_CODENAME
In gibtstretch
. Sehr traurige Nachricht.echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"
was für meine Aufgabe inFür systemd:
Ausgabe:
quelle
Eine weitere Heuristik besteht darin, festzustellen, woher die Pakete für das aktuell ausgeführte Betriebssystem stammen.
Einfache (und wahrscheinlich fehleranfällige) Variante:
Eine zuverlässigere Methode besteht darin, die Details aus der Ausgabe von
apt-cache policy
(ohne weitere Parameter) zu analysieren :apt-cache policy
listet alle auf dem lokalen System verwendeten APT-Repositorys auf. Wir filtern diejenigen heraus, die von Debian stammen, die nur alsDebian
solche gekennzeichnet sind (dh nicht diejenigen, die als z. B. gekennzeichnet sindDebian debug
), schauen uns dann nur das Hauptarchiv an (nichtcontrib
odernon-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:Eine weitere Möglichkeit wäre, die
/var/lib/apt/lists/*Release
Dateien selbst zu analysieren, anstatt dies zuzulassenapt-cache
:quelle
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
quelle
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:
Dies funktioniert auch für "jessie"
quelle
Nur mit
grep
:Probieren Sie es aus (Ausgabe zum Zeitpunkt des Schreibens dieses Beitrags):
quelle
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:
quelle